1. 程式人生 > 其它 >JDBC: 預處理物件 - PreparedStatement

JDBC: 預處理物件 - PreparedStatement

1 PreparedStatement 介面介紹

  •     PreparedStatement 是 Statement 介面的子介面,繼承於父介面中所有的方法。它是一個預編譯的 SQL 語句物件.
  • 預編譯: 是指SQL 語句被預編譯,並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行 該語句

2 PreparedStatement 特點

  因為有預先編譯的功能,提高 SQL 的執行效率。

  可以有效的防止 SQL 注入的問題,安全性更高

3 獲取PreparedStatement物件

  通過Connection建立PreparedStatement物件

Connection 介面中的方法

說明

PreparedStatement prepareStatement(String sql)

指定預編譯的 SQL 語句,

SQL 語句中使用佔位符 ? 建立一個語句物件

4 PreparedStatement介面常用方法

常用方法

說明

int executeUpdate();

執行insert update delete語句.

ResultSet executeQuery();

執行select語句. 返回結果集物件 Resulet

5 使用PreparedStatement的步驟

1) 編寫 SQL 語句,未知內容使用?佔位

"SELECT * FROM jdbc_user WHERE username=? AND password=?";

2) 獲得 PreparedStatement 物件

3) 設定實際引數:setXxx( 佔位符的位置, 真實的值)

4) 執行引數化 SQL 語句

5) 關閉資源

SetXxx 過載方法 說明
void setDouble(int parameterIndex, double x)

將指定引數設定為給定 Java double 值。

void setInt(int parameterIndex, int x)

將指定引數設定為給定 Java int 值。

void setString(int parameterIndex, String x)

將指定引數設定為給定 Java String 值。

void setObject(int parameterIndex, Object x)

使用給定物件設定指定引數的值。

6 使用PreparedStatement完成登入案例

  使用 PreparedStatement 預處理物件,可以有效的避免SQL注入

  

  步驟:

     1.獲取資料庫連線物件

    2.編寫SQL 使用? 佔位符方式

    3.獲取預處理物件 (預編譯物件會將Sql傳送給資料庫,進行預編譯)

    4.提示使用者輸入使用者名稱 & 密碼

    5.設定實際引數:setXxx(佔位符的位置, 真實的值)

    6.執行查詢獲取結 果集

    7.判斷是否查詢到資料    

    8.關閉資源

public class TestLogin02 {
 
    /**
     * 使用預編譯物件 PrepareStatement 完成登入案例
     * @param args
     * @throws SQLException
     */ 

     public static void main(String[] args) throws SQLException {
  
        //1.獲取連線 
        Connection connection = JDBCUtils.getConnection();

        //2.獲取Statement
       Statement statement = connection.createStatement();

        //3.獲取使用者輸入的使用者名稱和密碼
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入使用者名稱: ");
        String name = sc.nextLine();

        System.out.println("請輸入密碼: ");  
        String pass = sc.nextLine();
        System.out.println(pass);
 
        //4.獲取 PrepareStatement 預編譯物件

        //4.1 編寫SQL 使用 ? 佔位符方式
        String sql = "select * from jdbc_user where username = ? and password = ?";
        PreparedStatement ps = connection.prepareStatement(sql);
 
        //4.2 設定佔位符引數 
        ps.setString(1,name);
        ps.setString(2,pass);

        //5. 執行查詢 處理結果集
        ResultSet resultSet = ps.executeQuery();

        if(resultSet.next()){
             System.out.println("登入成功! 歡迎您: " + name); 
        }else{
             System.out.println("登入失敗!");
        }      

        //6.釋放資源
         JDBCUtils.close(connection,statement,resultSet);
    }
}

7 PreparedStatement的執行原理

  分別使用 Statement物件 和 PreparedStatement物件進行插入操作

程式碼示例

public class TestPS {
 
    public static void main(String[] args) throws SQLException {

         Connection con = JDBCUtils.getConnection();
 
        //獲取 Sql語句執行物件
        Statement st = con.createStatement();
 
        //插入兩條資料
        st.executeUpdate("insert  into jdbc_user values(null,'張三','123','1992/12/26')");
        st.executeUpdate("insert  into jdbc_user values(null,'李四','123','1992/12/26')");

        //獲取預處理物件
        PreparedStatement ps = con.prepareStatement("insert  into jdbc_user values(?,?,?,?)");

         //第一條資料 設定佔位符對應的引數
         ps.setString(1,null);
         ps.setString(2,"長海");
         ps.setString(3,"qwer");
         ps.setString(4,"1990/1/10");

         // 執行插入
         ps.executeUpdate();

         //  第二條資料
         ps.setString(1,null);
         ps.setString(2,"小斌");
         ps.setString(3,"1122");
         ps.setString(4,"1990/1/10");
 
     
         //執行插入 
        ps.executeUpdate();

        //釋放資源
        st.close();
        ps.close();
        con.close();
     }
}
 
             

8 Statement 與 PreparedStatement的區別

  1. Statement用於執行靜態SQL語句,在執行時,必須指定一個事先準備好的SQL語句

  2.PrepareStatement是預編譯的SQL語句物件,語句中可以包含動態引數“?”,在執行時可以為“?”動態設定引數值

  3. PrepareStatement可以減少編譯次數提高資料庫效能