JDBC使用PreparedStatement的好處

541732025發表於2014-04-21

我們為什麼在程式中要使用PreparedStatement而不是Statement?有以下幾個原因。
1,從程式本身的角度來看
PreparedStatement更具效率。
我們透過connection.preparedStatement(sql)方法來獲得PreparedStatment物件,
然後透過preStatement.setXXX來設定查詢引數。
如果我有2個查詢,SQL語句都一樣,但是引數不同,使用PreparedStatment的話只需setXXX不同的引數、再次查詢即可,而如果使用Statement的話,
需要重新
建立Statement物件,connection.createStatement(sql)

2,從資料庫層面來講,PreparedStatment更具效率。
在使用PreparedStatement時,資料庫系統會對sql語句進行預編譯處理(前提是JDBC驅動支援),具體包括SQL語句的分析,編譯,最佳化等過程預編譯後會快取起來,執行計劃同樣也會快取起來編譯的sql查詢語句能在將來的查詢中重用(同樣的查詢,哪怕引數值不同)。

需要注意的是,使用PreparedStatement時,SQL不要用String追加引數值,而應該使用preStatement.setXXX來設定查詢引數。


3,PreparedStatment可以防止SQL隱碼攻擊。
如:String sql = "SELECT * FROM user WHERE name = '" + userName + "' and password = '"+ passWord +"';"
惡意輸入引數值:
userName = "1' OR '1'='1";    passWord = "1' OR '1'='1";
最終sql會變成:String sql = "SELECT * FROM user WHERE name = '1' OR '1'='1' and password = '1' OR '1'='1';"
這條語句相當於select * from user。
如果使用者再加上drop table user,後果將不堪設想。
所以使用PreparedStatement能避免此種情況,因為資料庫系統不會將引數的內容視為SQL指令的一部分來處理,只有在資料庫完成SQL指令的編譯後,才套用引數執行。因此就算引數中含有破壞性的指令,也不會被資料庫所執行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1146364/,如需轉載,請註明出處,否則將追究法律責任。

相關文章