#創建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接口的方法: 咱們能夠看到總共就三種類型:索引
方法 | 做用 |
---|---|
execute() | 主要在存儲過程和動態SQL語句中使用 |
executeUpdate() | 對應INSERT,UPDATE 或 DELETE 語句 |
executeQuery() | 對應SELECT,查詢專用 |
根據實際的須要對這些類型進行選擇,在此就不進行詳細講解了。接口