PreparedStatement 預編譯

什麼是預編譯語句? 
預編譯語句PreparedStatementjava.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傳入,這就嚴重危害了數據庫安全了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章