JAVA中JDBC預編譯原理

什麼是預編譯語句?

      預編譯語句PreparedStatement 是java.sql中的一個接口,它是Statement的子接口。通過Statement對象執行SQL語句時,需要將SQL語句發送給DBMS,由DBMS首先進行編譯後再執行。預編譯語句和Statement不同,在創建PreparedStatement 對象時就指定了SQL語句,該語句立即發送給DBMS進行編譯。當該編譯語句被執行時,DBMS直接運行編譯後的SQL語句,而不需要像其他SQL語句那樣首先將其編譯。 

什麼時候使用預編譯語句 

     但是當語句格式固定時我們更傾向於使用PreparedStatement,只有當語句格式無法預見時,我們才考慮採用Statement。 
     一般是在需要反覆使用一個SQL語句時才使用預編譯語句,預編譯語句常常放在一個for或者while循環裏面使用,通過反覆設置參數從而多次使用該SQL語句;爲了防止SQL注入漏洞,在某些數據操作中也使用預編譯語句。 

爲什麼使用預編譯語句 
     1、提高效率 
          當需要對數據庫進行數據插入、更新或者刪除的時候,程序會發送整個SQL語句給數據庫處理和執行。數據庫處理一個SQL語句,需要完成解析SQL語句、檢查語法和語義以及生成代碼;一般說來,處理時間要比執行語句所需要的時間長。預編譯語句在創建的時候已經是將指定的SQL語句發送給了DBMS,完成了解析、檢查、編譯等工作。因此,當一個SQL語句需要執行多次時,使用預編譯語句可以減少處理時間,提高執行效率。 
      2、提高安全性 
           惡意的SQL語句 
String sql = "select * from tb_name where name= ’"+varname+"’ and passwd=’"+varpasswd+"’"; 
如果我們把[’ or ’1’ = ’1]作爲varpasswd傳入進來.用戶名隨意,看看會成爲什麼? 
select * from tb_name = ’隨意’ and passwd = ’’ or ’1’ = ’1’;因爲’1’=’1’肯定成立,所以可以任何通過驗證.更有甚者: 
把[’;drop table tb_name;]作爲varpasswd傳入進來,則:select * from tb_name = ’隨意’ and passwd = ’’;drop table tb_name;有些數據庫是不會讓你成功的,但也有很多數據庫就可以使這些語句得到執行. 
而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關係.只要全使用預編譯語句,你就用不着對傳入的數據做任何過慮.而如果使用普通的statement,有可能要對drop,;等做費盡心機的判斷和過慮. 

預編譯語句的使用 
1、創建 PreparedStatement 對象 
       以下的代碼段(其中 con 是 Connection 對象)創建包含帶兩個 IN 參數佔位符的 SQL 語句的 PreparedStatement 對象: 
  PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?"); 
  pstmt 對象包含語句 "UPDATE table4 SET m = ? WHERE x = ?",它已發送給DBMS,併爲執行作好了準備。 
2、傳遞 IN 參數 
    在執行 PreparedStatement 對象之前,必須設置每個 ? 參數的值。這可通過調用 setXXX 方法來完成,其中 XXX 是與該參數相應的類型。例如,如果參數具有Java 類型 long,則使用的方法就是 setLong。setXXX 方法的第一個參數是要設置的參數的序數位置,第二個參數是設置給該參數的值。例如,以下代碼將第一個參數設爲 123456789,第二個參數設爲 100000000: 
  pstmt.setLong(1, 123456789); 
  pstmt.setLong(2, 100000000);  
一旦設置了給定語句的參數值,其值將一直保留,直到被設置爲新值或者調用clearParameters()方法清除它爲止。


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