JDBC詳解系列(四)之創建Stament和執行SQL語句

#創建Stament   在得到鏈接以後,咱們就能夠跟數據庫進行交互了。   在JDBC中,咱們發送SQL語句到數據庫這些操做時經過Stament,Preparement,CallableStatement這幾個對象進行的。 ##一.Stament##   Stament是一個接口,其具體實現由供應商所提供。調用方法:java

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   stmt.executeXXX(SQL);
   .  .  .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

  Stament對象執行靜態SQL語句,並返回相應結果。所以,其不接收參數。在執行完畢以後務必將打開的鏈接關閉,這是一個好的習慣。 ##二.PreparedStatement ##   PreparedStatement 接口擴展了 Statement 接口,大多數狀況下PreparedStatement 中的SQL語句已經被預編譯過,於是當其執行時,只需DBMS運行SQL語句,而沒必要先編譯。調用方法:sql

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   pstmt .setXXX();
   ... 
   pstmt.executeXXX();
   
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

  PreparedStatement在建立對象時對SQL進行了預編譯。參數都被用 ? 符號表示,這是已知的參數標記。在執行 SQL 語句以前,必須賦予每個參數確切的數值。經過setXXX()來設定參數,其中 XXX 表示你但願綁定到輸入參數的 Java 數據類型。每一個參數標記映射它的序號位置。第一標記表示位置 1 ,下一個位置爲 2 等等。這種方法不一樣於 Java 數組索引,它是從 0 開始的。 ##三.CallableStatement ##   CallableStatement 對象是用來調用數據庫的存儲過程的。調用方法:數據庫

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   stmt.setInt(1, empID);
   stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
   stmt.execute();
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

  有三種類型的參數有:IN,OUT 和 INOUT。PreparedStatement 對象只使用 IN 參數。CallableStatement 對象能夠使用全部的三個參數。CallableStatement 也是經過 setXXX() 方法綁定對應的 Java 數據類型。使用 OUT 和 INOUT 參數時,你就必須使用額外的 CallableStatement 方法 - registerOutParameter()。 registerOutParameter() 方法綁定 JDBC 數據類型,該數據是存儲過程返回的值。CallableStatement 的 getXXX ()方法將獲取返回的參數值,()內的參數與registerOutParameter相對應。 ##四.總結##   存儲過程使用的必然是CallableStatement了。而Stament和PreparedStament之間使用時仍是須要有所取捨的。   1.Stament不接受參數,其有可能會被SQL注入。但其開銷比較小;每次執行SQL語句,數據庫都要對SQL語句進行編譯,從0開始執行。在只進行一次或少許查詢並返回結果時,其效率高於PreparedStament。但沒法防止SQL注入。數組

  2.PreparedStatement是預編譯的,當執行時,DBMS只須要運行SQL語句,而無需先編譯再執行。因此當在咱們處理批量的時候,使用PreparedStatement能夠大大的提升效率。同時,也能夠防止SQL注入。code

  3.雖然Stament在數量少時進行SQL語句開銷小,但其存在SQL注入的問題。所以,咱們在用戶能夠更改SQL輸入的地方,如WEB等,應該使用PreparedStatement。任何不通過PreparedStatement處理的狀況下,用戶的全部輸入都不該該傳遞給SQL語句。對象

#執行SQL語句   咱們能夠查看Stement接口的方法: Stament execute   咱們能夠看到總共就三種類型:索引

方法 做用
execute() 主要在存儲過程和動態SQL語句中使用
executeUpdate() 對應INSERT,UPDATE 或 DELETE 語句
executeQuery() 對應SELECT,查詢專用

  根據實際的須要對這些類型進行選擇,在此就不進行詳細講解了。接口

相關文章
相關標籤/搜索