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可以減少編譯次數提高資料庫效能