JDBC使用預編譯SQL的好處

首先是效率性 java

 PreparedStatement能夠儘量的提升訪問數據庫的性能,咱們都知道數據庫在處理SQL語句時都有一個預編譯的過程,而預編譯對象就是把一些格式固定的SQL編譯後,存放在內存池中即數據庫緩衝池,當咱們再次執行相同的SQL語句時就不須要預編譯的過程了,只需DBMS運行SQL語句。因此當你須要執行Statement對象屢次的時候,PreparedStatement對象將會大大下降運行時間,特別是的大型的數據庫中,它能夠有效的也加快了訪問數據庫的速度。
其次,使用PreparedStatement對象能夠大大提升代碼的可讀性和可維護性 sql

例如咱們在向數據庫插入數據: 數據庫

一種是使用Statement對象 安全

   java.sql.Statement   stmt=conn.createStatement(); 性能

  stmt.executeUpdate("insert into student (name,id,number,count) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
  另外一種是使用PreparedStatement對象 spa

String  sql ="insert into student values(null,?,?,?)"; 設計

java.sql.PreparedStatement pstmt=conn.preparedStatement(sql); 對象

pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
pstmt.executeUpdate(); 內存

使用佔位符?代替 開發

將參數與SQL語句分離出來,這樣就能夠方便對程序的更改和延續,一樣,也能夠減小沒必要要的錯誤。

最後就是安全性了。 如下轉自百度文庫:傳遞給PreparedStatement對象的參數能夠被強制進行類型轉換,使開發人員能夠確保在插入或查詢數據時與底層的數據庫格式匹配。 當處理公共Web站點上的用戶傳來的數據的時候,安全性的問題就變得極爲重要。傳遞給PreparedStatement的字符串參數會自動被驅動器忽略。最簡單的狀況下,這就意味着當你的程序試着將字符串「D'Angelo」插入到VARCHAR2中時,該語句將不會識別第一個「,」,從而致使悲慘的失敗。幾乎不多有必要建立你本身的字符串忽略代碼。 在Web環境中,有惡意的用戶會利用那些設計不完善的、不能正確處理字符串的應用程序。特別是在公共Web站點上,在沒有首先經過PreparedStatement對象處理的狀況下,全部的用戶輸入都不該該傳遞給SQL語句。此外,在用戶有機會修改SQL語句的地方,如HTML的隱藏區域或一個查詢字符串上,SQL語句都不該該被顯示出來。 在執行SQL命令時,咱們有二種選擇:可使用PreparedStatement對象,也可使用Statement對象。不管多少次地使用同一個SQL命令,PreparedStatement都只對它解析和編譯一次。當使用Statement對象時,每次執行一個SQL命令時,都會對它進行解析和編譯。  

相關文章
相關標籤/搜索