一、先行編譯的SQL語句處理
先行編譯語句PreparedStatement 是java.sql中的一個介面,它是Statement的子介面。通過Statement對象執行SQL語句時,需要將SQL語句發送給DBMS,由DBMS首先進行編譯後再執行。先行編譯語句和Statement不同,在建立PreparedStatement 對象時就指定了SQL語句,該語句立即發送給DBMS進行編譯。當該編譯語句被執行時,DBMS直接運行編譯後的SQL語句,而不需要像其他SQL語句那樣首先將其編譯。先行編譯的SQL語句處理效能稍微高於普通的傳遞變數的辦法。
二、先行編譯語句的作用
·提高效率:當需要對資料庫進行資料插入、更新或者刪除的時候,程式會發送整個SQL語句給資料庫處理和執行。資料庫處理一個SQL語句,需要完成解析SQL語句、檢查文法和語義以及產生代碼;www.bkjia.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()方法清除它為止。代碼如下: