Oracle預編譯的SQL語句處理

一、預編譯的SQL語句處理

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

 二、預編譯語句的作用

·提高效率:當需要對數據庫進行數據插入、更新或者刪除的時候,程序會發送整個SQL語句給數據庫處理和執行。數據庫處理一個SQL語句,需要完成解析SQL語句、檢查語法和語義以及生成代碼;www.linuxidc.com一般說來,處理時間要比執行語句所需要的時間長。預編譯語句在創建的時候已經是將指定的SQL語句發送給了DBMS,完成了解析、檢查、編譯等工作。因此,當一個SQL語句需要執行多次時,使用預編譯語句可以減少處理時間,提高執行效率。

·提高安全性:假如有惡意的SQL語句:String sql = "select * from t_student where name= '"+varname+"' and passwd='"+varpasswd+"'";如果我們把" or '1' = '1' "作爲varpasswd傳入進來.用戶名隨意,看看會成爲什麼?
select * from t_student = '隨意' and passwd = '' or '1' = '1'; 因爲'1'='1'肯定成立,所以可以任何通過驗證.更有甚者:把" ';drop table t_student;"作爲varpasswd傳入進來,則:select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些數據庫是不會讓你成功的,但也有很多數據庫就可以使這些語句得到執行.而如果使用預編譯語句.傳入的任何內容就不會和原來的語句發生任何匹配的關係.只要全使用預編譯語句,就用不着對傳入的數據做任何過慮.而如果使用普通的statement,有可能要對drop,;等做費盡心機的判斷和過慮。

三、預編譯語句的使用

1、創建 PreparedStatement 對象
       以下的代碼段(其中 conn 是 Connection 對象)創建包含帶4個 IN 參數佔位符的 SQL 語句的 PreparedStatement 對象:

       String sql = "insert into t_customer values(?,?,?,?)";//組織一條含有參數的SQL語句
  PreparedStatement ps = conn.prepareStatement(sql);
  ps對象包含語句 insert into t_customer values(?,?,?,?),它已發送給DBMS,併爲執行作好了準備。
2、傳遞 IN 參數
    在執行 PreparedStatement 對象之前,必須設置每個 ? 參數的值。這可通過調用 setXXX 方法來完成,其中 XXX 是與該參數相應的類型。例如,如果參數具有Java 類型 long,則使用的方法就是 setLong。setXXX 方法的第一個參數是要設置的參數的序數位置,第二個參數是設置給該參數的值。例如,以下代碼將第一個參數設爲 輸進來的account,第二個參數設爲 password:
  ps.setString(1, account);
  ps.setString(2, password); 
一旦設置了給定語句的參數值,其值將一直保留,直到被設置爲新值或者調用clearParameters()方法清除它爲止。代碼如下:

轉:https://www.linuxidc.com/Linux/2011-07/38776.htm 

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