Statement和PreparedStatement的區別


先來說說,什么是java中的Statement:Statement是java執行數據庫操作的一個重要方法,用於在已經建立數據庫連接的基礎上,向數據庫發送要執行的SQL語句。具體步驟:

  1.首先導入java.sql.*;這個包。

  2.然后加載驅動,創建連接,得到Connection接口的的實現對象,比如對象名叫做conn。

  3.然后再用conn對象去創建Statement的實例,方法是:Statement stmt = conn.creatStatement("SQL語句字符串");

  Statement 對象用於將 SQL 語句發送到數據庫中。實際上有三種 Statement 對象,它們都作為在給定連接上執行 SQL語句的包容器:Statement、PreparedStatement(它從 Statement 繼承而來)和CallableStatement(它從 PreparedStatement 繼承而來)。它們都專用於發送特定類型的 SQL 語句:Statement 對象用於執行不帶參數的簡單 SQL 語句;PreparedStatement 對象用於執行帶或不帶參數的預編譯 SQL 語句;CallableStatement 對象用於執行對數據庫已存儲過程的調用。

  綜上所述,總結如下:Statement每次執行sql語句,數據庫都要執行sql語句的編譯,最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement.但存在sql注入風險。PreparedStatement是預編譯執行的。在執行可變參數的一條SQL時,PreparedStatement要比Statement的效率高,因為DBMS預編譯一條SQL當然會比多次編譯一條SQL的效率高。安全性更好,有效防止SQL注入的問題。對於多次重復執行的語句,使用Prepared

Statement效率會更高一點。執行SQL語句是可以帶參數的,並支持批量執行SQL。由於采用了Cache機制,則預編譯的語句,就會放在Cache中,下次執行相同的SQL語句時,則可以直接從Cache中取出來。

PreparedStatement pstmt  =  con.prepareStatement("UPDATE EMPLOYEES  SET name= ? WHERE ID = ?");
pstmt.setString(1, "李四");
pstmt.setInt(2, 1);
pstmt. executeUpdate();

 

那么CallableStatement擴展了PreparedStatement的接口,用來調用存儲過程,它提供了對於輸入和輸出參數的支持,CallableStatement 接口還有對 PreparedStatement 接口提供的輸入參數的sql查詢的支持。

PreparedStatement: 數據庫會對sql語句進行預編譯,下次執行相同的sql語句時,數據庫端不會再進行預編譯了,而直接用數據庫的緩沖區,提高數據訪問的效率(但盡量采用使用?號的方式傳遞參數),如果sql語句只執行一次,以后不再復用。

 從安全性上來看,PreparedStatement是通過?來傳遞參數的,避免了拼sql而出現sql注入的問題,所以安全性較好。
 在開發中,推薦使用 PreparedStatement


免責聲明!

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



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