statement和preparestatement的區別


 
 

1.連接數據庫的步驟中Statement和PrepareStatement的區別:
Statement:
String sql="insert into student(stuo,stuname) values('"name"',"age"+")";
Statement.excuteupadte(sql);
PrepareStatement:
String sql="insert into student(stuo,stuname) values(?,?)";
PrepareStatement=connection.PrepareStatement(sql); //預編譯SQL
PrepareStatement.setString(1,name);
PrepareStatement.setInt(2,age);

2.提高性能

     當處理批量SQL語句時,這個時候就可以體現PrepareStatement的優勢,由於采用Cache機制,則預先編譯的語句,就會

放在Cache中,下次執行相同SQL語句時,則可以直接從Cache中取出來。


需要重復100條數(因為有預編譯,只編譯一次)

1. statement每次執行sql語句,相關數據庫都要執行sql語句的編譯;preparedstatement是預編譯的, 采用Cache機制(預編譯語句,放在Cache中,下次執行相同SQL語句時,則可以直接從Cache中取出來,有利於sql生成查詢計划。),對於批量處理可以大大提高效率. 也叫JDBC存儲過程。

例如,如果要執行兩條sql語句

1
2
SELECT colume FROM TABLE WHERE colume= 1 ;
SELECT colume FROM TABLE WHERE colume= 2 ;

會生成兩個執行計划

一千個查詢就生成一千個執行計划!

PreparedStatement用於使用綁定變量重用執行計划

1
SELECT colume FROM TABLE WHERE colume=:x;

通過set不同數據只需要生成一次執行計划,可以重用

是否使用綁定變量對系統影響非常大,生成執行計划極為消耗資源

兩種實現 速度差距可能成百上千倍

后者使用了PreparedStatement對象,而前者是普通的 Statement對象。PreparedStatement對象不僅包含了SQL語句,而且大多數情況下這個語句已經被預編譯過,因而當其執行時,只需 DBMS運行SQL語句,而不必先編譯。當你需要執行Statement對象多次的時候,PreparedStatement對象將會大大降低運行時間, 當然也加快了訪問數據庫的速度。

這種轉換也給你帶來很大的便利,不必重復SQL語句的句法,而只需更改其中變量的值,便可重新執行SQL語句。選擇PreparedStatement對象與否,在於相同句法的SQL語句是否執行了多次,而且兩次之間的差別僅僅是變量的不同。如果僅僅執行了一次的話,在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理,PreparedStatement 對象的開銷比Statement大,對於一次性操作並不會帶來額外的好處。

3.PrepareStatement中執行的SQL語句中是可以帶參數的,也就是說可以替換變量,盡量采用使用?號的方式傳遞參數,增加代碼的可讀性又可以預編譯加速;而Statement則不可以。

4. 防止SQL注入。在SQL中包含特殊字符或SQL的關鍵字(如:’ or 1 or ‘)時,Statement將出現不可預料的結果(出現異常或查詢的結果不正確),可用PreparedStatement來解決。

注:SQL注入或者說SQL注入攻擊就是利用Statement的漏洞完成的,例如用個用戶登錄,那么form表單有用戶名和密碼

那么我提交時,在用戶名輸入框內 輸入 “aaa’ or ’a’=’a” 密碼框隨便輸入,那么這樣意味着 sql的

查詢語言就是 “select * from 表 where 用戶名=’aaa’ or ’a’=’a’ and 密碼=’123’  ”,這樣查詢出來所有的數據或者是混亂。那么不被授權的用戶照樣可以登錄,豈不是被黑了?!實際中現在java程序員早都不用這種方式寫查詢了,一般都 用PreparedStatement來查詢,或干脆就用hibernate之類的持久層框架,這樣通過sql注入就無從談起了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM