什麼是預編譯語句?
預編譯語句PreparedStatement是java.sql中的一個接口,它是Statement的子接口。通過Statement對象執行sql語句時,需要將sql語句發送給DBMS,由DBMS首先進行編譯再執行(在創建通道的時候並不進行sql的編譯工作,事實上也無法進行編譯)。而通過PreparedStatement不同,在創建PreparedStatement對象時就指定了sql語句,該語句立即發送給DBMS進行編譯,當該語句被執行時,DBMS直接運行編譯後的sql語句,而不需要像其他sql語句那樣首先將被編譯。
例如我們在向數據庫插入數據:
一種是使用Statement對象
java.sql.Statement stmt=conn.createStatement();
stmt.executeUpdate("insert into student(name,id,number,count) "
+ "values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
另一種是使用PreparedStatement對象
String sql ="insertinto student values(null,?,?,?)";
//創建PreparedStatement對象時編譯sql語句
java.sql.PreparedStatement pstmt=conn.preparedStatement(sql); pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
//當該語句被執行時,DBMS直接運行編譯後的sql語句
使用佔位符?代替
將參數與SQL語句分離出來,這樣就可以方便對程序的更改和延續,同樣,也可以減少不必要的錯誤
pstmt.executeUpdate();
什麼時候使用預編譯語句?
當語句格式固定的時我們傾向於使用PreparedStatement,只有當語句格式無法預見時,才考慮使用Statement。
一般在考慮反覆使用一個sql語句時才使用預編譯,預編譯語句常常放在一個循環中使用(在這種情況下預編譯的優勢就很明顯了),通過反覆設置參數從而達到多次使用該語句;還有一個原因就是防止sql注入漏洞。
爲什麼使用預編譯語句?
1、提高效率
當需要數據庫進行數據插入、更新或者刪除的時候,程序給發送整個sql語句給數據庫處理和執行。數據庫處理一條sql語句,需要完成對sql語句的解析、檢查語法以及生成代碼;一般來說,處理時間要比執行sql的時間長。預編譯語句在創建的時候就已經將sql語句發送給了DBMS,完成了解析、檢查語法以及生成代碼的過程。因此,當一個sql語句需要執行多次時,使用預編譯語句可以減少處理時間,提高執行效率。
2、提高安全性
惡意的sql語句
Stringsql = “select * from user_tb where username= ‘”+username+”’and password = ‘”+password+”’;
如果我們把[‘or’1’=’1]作爲password傳入,用戶名隨意,那麼就可以隨意登陸了。更有甚者,把[‘;drop table user_tb;]作爲password傳入,這就嚴重危害了數據庫安全了。