日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC预处理对象prepareStatement

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC预处理对象prepareStatement 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDBC預處理對象prepareStatement概述

一、SQL注入問題

SQL注入:用戶輸入的內容作為了SQL語句語法的一部分,改變了原有SQL真正的意義。
假設有登錄案例SQL語句如下:
SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸的密碼;
此時,當用戶輸入正確的賬號與密碼后,查詢到了信息則讓用戶登錄。但是當用戶輸入的賬號為XXX 密碼為:XXX’ OR ‘a’=’a時,則真正執行的代碼變為:
SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此時,上述查詢語句時永遠可以查詢出結果的。那么用戶就直接登錄成功了,顯然我們不希望看到這樣的結果,這便是SQL注入問題。
為此,我們使用PreparedStatement來解決對應的問題。

二、代碼演示SQL注入問題

(1)數據庫準備

代碼如下:

#創建sql_into數據庫 CREATE DATABASE sql_into; #使用sql_into數據庫 USE sql_into; #創建sql_into用戶表 CREATE TABLE users(uid INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(200),PASSWORD VARCHAR(200) ); #加入用戶信息 INSERT INTO users(username,PASSWORD) VALUES('xiaoming','123'),('xiaoliang','456'); #查詢用戶信息 SELECT *FROM users;

mysql代碼演示

(2)創建用戶登錄界面

public class StatementMyCode {public static void main(String[] args) throws SQLException {Scanner sc=new Scanner(System.in);System.out.println("請輸入用戶名:");String username =sc.nextLine();System.out.println("請輸入密碼:");String password=sc.nextLine(); //獲取JDBCUtils連接Connection con=JDBCUtils1.getConnection();//Connection con= JDBCUtils1.getConnection(); //獲取Statedment對象Statement stat=con.createStatement(); //執行SQL語句String sql = "select * from users where username='"+username+"' and password ='"+password+"'";System.out.println(sql);ResultSet rs=stat.executeQuery(sql);if(rs.next()){System.out.println("登錄成功!");}else{System.out.println("登錄失敗!");}JDBCUtils1.close(rs,stat,con);} }

SQL注入出現的登錄BUG

(3)配置文件代碼

配置文件代碼文件名需要和JDBCUtils1里的工具類的配置文件保持一致,配置文件代碼文件名為config.properties
className=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/sql_into
user=root
password=root

(4)JDBCUtils1文件代碼

public class JDBCUtils1 {private static String url;private static String user;private static String password;private static String className;private JDBCUtils1(){}static {try{Properties p=new Properties();InputStream in = JDBCUtils1.class.getClassLoader().getResourceAsStream("config.properties");p.load(in);in.close();url=p.getProperty("url");user=p.getProperty("user");password=p.getProperty("password");className=p.getProperty("className");//注冊驅動Class.forName(className);}catch (Exception e){e.printStackTrace();} }public static Connection getConnection(){//獲取連接Connection con=null;try {con= DriverManager.getConnection(url,user,password);return con;} catch (SQLException e) {throw new RuntimeException("連接失敗");}}public static void close(ResultSet rs, Statement stat,Connection con){try {if(rs!=null)rs.close();} catch (SQLException e) {e.printStackTrace();}try {if(stat!=null)stat.close();} catch (SQLException e) {e.printStackTrace();}try {if (con!=null)con.close();} catch (SQLException e) {e.printStackTrace();}} }

三、防止SQL注入 使用預處理對象

(1)原理介紹

preparedStatement:預編譯對象,是Statement對象的子類。
特點:

  • 性能高
  • 會把sql語句先編譯
  • 能過濾掉用戶輸入的關鍵字。
    PreparedStatement預處理對象,處理的每條sql語句中所有的實際參數,都必須使用占位符?替換。
String sql = "select * from user where username = ? and password = ?";

PreparedStatement使用,需要通過以下3步驟完成:

  • PreparedStatement預處理對象代碼:
    // 獲得預處理對象,需要提供已經使用占位符處理后的SQL語句
    PreparedStatement psmt = conn.prepareStatement(sql)
  • 設置實際參數
    void setXxx(int index, Xxx xx) 將指定參數設置指定類型的值
    參數1:index 實際參數序列號,從1開始。
    參數2:xxx 實際參數值,xxx表示具體的類型。
    例如:
    setString(2, “1234”) 把SQL語句中第2個位置的占位符?替換成實際參數 “1234”
  • 執行SQL語句:
    int executeUpdate(); --執行insert update delete語句.
    ResultSet executeQuery(); --執行select語句.
    boolean execute(); --執行select返回true 執行其他的語句返回false.
  • (2)使用preparedStatement

    用戶登錄界面代碼演示

    public class prepareStatementMyCode {public static void main(String[] args) throws SQLException {Scanner sc=new Scanner(System.in);System.out.println("請輸入用戶名:");String username =sc.nextLine();System.out.println("請輸入密碼:");String password=sc.nextLine(); //獲取JDBCUtils連接Connection con=JDBCUtils1.getConnection();//Connection con= JDBCUtils.getConnection(); //獲取Statedment對象Statement stat=con.createStatement(); //執行SQL語句String sql = "select * from users where username=? and password =?";PreparedStatement ps = con.prepareStatement(sql);ps.setObject(1,username);ps.setObject(2,password);System.out.println(sql);ResultSet rs=ps.executeQuery();if(rs.next()){System.out.println("登錄成功!");}else{System.out.println("登錄失敗!");}JDBCUtils1.close(rs,stat,con);} }

    正確執行代碼演示結果

    SQL注入代碼演示

    四、使用prepareStatement完成查詢數據

    代碼如下:

    public class prepareStatementCSDNSelect {public static void main(String[] args) {//獲取連接對象Connection con=null;PreparedStatement ps= null;ResultSet rs = null;try {con= JDBCUtils1.getConnection();String sql="select * from users";ps = con.prepareStatement(sql);rs = ps.executeQuery();while(rs.next()){int uid=rs.getInt("uid");String username=rs.getString("username");String password=rs.getString("password");System.out.println(uid+" "+username+" "+password);}} catch (SQLException e) {throw new RuntimeException(e);}finally {JDBCUtils1.close(rs,ps,con);}} }

    使用prepareStatement完成查詢

    五、使用prepareStatement和javabean類完成查詢

    (1)創建user1類

    代碼如下:

    /*一個類具備私有成員變量 空參構造方法 get/set 方法 實現序列化接口 那么稱這個類為javabean類*/ public class User1 {private int uid;private String username;private String password;public User1() {}public User1(int uid, String username, String password) {this.uid = uid;this.username = username;this.password = password;}public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User1{" +"uid=" + uid +", username='" + username + '\'' +", password='" + password + '\'' +'}';} }

    (2)使用把每條記錄封裝到user1對象中 將多個user1對象放到list集合當中

    /*查詢所有記錄 把每條記錄封裝到user1對象中 將多個user1對象放到list集合當中*/ public class prepareStatementCSDNSelectBean {public static void main(String[] args) {//獲取連接對象Connection con=null;PreparedStatement ps= null;ResultSet rs = null;try {con= JDBCUtils1.getConnection();String sql="select * from users";ps = con.prepareStatement(sql);rs = ps.executeQuery();//定義一個集合用來存儲user對象List<User1> list=new ArrayList<>();while(rs.next()){int uid=rs.getInt("uid");String username=rs.getString("username");String password=rs.getString("password");User1 u=new User1(uid,username,password);list.add(u);// System.out.println(uid+" "+username+" "+password);}System.out.println(list);} catch (SQLException e) {throw new RuntimeException(e);}finally {JDBCUtils1.close(rs,ps,con);}} }

    查詢結果演示

    總結

    以上是生活随笔為你收集整理的JDBC预处理对象prepareStatement的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。