JDBC Statements, PreparedStatement和CallableStatement語句

當得到了與數據庫的鏈接後,就能夠與數據庫進行交互了。 JDBC StatementCallableStatementPreparedStatement接口定義了可用於發送SQL或PL/SQL命令,並從數據庫接收數據的方法和屬性。java

它們還定義了有助於在Java和SQL數據類型的數據類型差別轉換的方法。
下表提供了每一個接口定義,以及使用這些接口的目的的總結。sql

接口 推薦使用
Statement 用於對數據庫進行通用訪問,在運行時使用靜態SQL語句時頗有用。 Statement接口不能接受參數。
PreparedStatement 當計劃要屢次使用SQL語句時使用。PreparedStatement接口在運行時接受輸入參數。
CallableStatement 當想要訪問數據庫存儲過程時使用。CallableStatement接口也能夠接受運行時輸入參數。

1. Statement對象

1.1. 建立Statement對象

在使用Statement對象執行SQL語句以前,須要使用Connection對象的createStatement()方法建立一個Statement對象,如如下示例所示:數據庫

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

在建立Statement對象後,可使用它來執行一個SQL語句,它有三個執行方法能夠執行。它們分別是 -數組

  • boolean execute (String SQL) : 若是能夠檢索到ResultSet對象,則返回一個布爾值true; 不然返回false。使用此方法執行SQLDDL語句或須要使用真正的動態SQL,可以使用於執行建立數據庫,建立表的SQL語句等等。
  • int executeUpdate (String SQL): 返回受SQL語句執行影響的行數。使用此方法執行預期會影響多行的SQL語句,例如:INSERTUPDATEDELETE語句。
  • ResultSet executeQuery(String SQL):返回一個ResultSet對象。 當您但願得到結果集時,請使用此方法,就像使用SELECT語句同樣。

1.2. 關閉Statement對象

就像關閉一個Connection對象同樣,以保存數據庫資源同樣,因爲一樣的緣由,還應該關閉Statement對象。ide

一個簡單的調用close()方法將執行該做業(工做)。 若是先關閉Connection對象,它也會關閉Statement對象。 可是,應該始終顯式關閉Statement對象,以確保正確的清理順序。學習

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

爲了更好的理解,建議學習Statment示例教程 。code

2. PreparedStatement對象

PreparedStatement接口擴展了Statement接口,它添加了比Statement對象更好一些優勢的功能。對象

此語句能夠動態地提供/接受參數。教程

2.1 建立PreparedStatement對象

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

JDBC中的全部參數都由 ? 符號做爲佔位符,這被稱爲參數標記。 在執行SQL語句以前,必須爲每一個參數(佔位符)提供值。索引

setXXX()方法將值綁定到參數,其中XXX表示要綁定到輸入參數的值的Java數據類型。 若是忘記提供綁定值,則將會拋出一個SQLException

每一個參數標記是它其順序位置引用。第一個標記表示位置1,下一個位置2等等。 該方法與Java數組索引不一樣(它不從0開始)。

全部Statement對象與數據庫交互的方法(a)execute(),(b)executeQuery()和(c)executeUpdate()也能夠用於PreparedStatement對象。 可是,這些方法被修改成可使用輸入參數的SQL語句。

2.2. 關閉PreparedStatement對象

就像關閉Statement對象同樣,因爲一樣的緣由(節省數據庫系統資源),也應該關閉PreparedStatement對象。

簡單的調用close()方法將執行關閉。 若是先關閉Connection對象,它也會關閉PreparedStatement對象。 可是,應該始終顯式關閉PreparedStatement對象,以確保以正確順序清理資源。

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

爲了更好的理解,建議學習PreparedStatement示例代碼 。

3. CallableStatement對象

相似Connection對象建立StatementPreparedStatement對象同樣,它還可使用一樣的方式建立CallableStatement對象,該對象將用於執行對數據庫存儲過程的調用。

3.1. 建立CallableStatement對象

假設須要執行如下Oracle存儲過程 -

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;
SQL

注意:上面的存儲過程是針對Oracle編寫的,可是若是您使用MySQL數據庫,可以使用如下方式來編寫MySQL相同的存儲過程,以下在EMP數據庫中建立它 -

DELIMITER $$

DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$

DELIMITER ;
SQL

存在三種類型的參數:INOUTINOUT。 PreparedStatement對象只使用IN參數。CallableStatement對象可使用上面三個參數類型。

如下是上面三種類型參數的定義 -

參數 描述
IN 建立SQL語句時其參數值是未知的。 使用setXXX()方法將值綁定到IN參數。
OUT 由SQL語句返回的參數值。可使用getXXX()方法從OUT參數中檢索值。
INOUT 提供輸入和輸出值的參數。使用setXXX()方法綁定變量並使用getXXX()方法檢索值。

如下代碼片斷顯示瞭如何使用Connection.prepareCall()方法根據上述存儲過程來實例化一個CallableStatement對象 -

CallableStatement cstmt = null;
try {
   String strSQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}
Java

String變量strSQL表示存儲過程,帶有兩個參數佔位符。

使用CallableStatement對象就像使用PreparedStatement對象同樣。 在執行語句以前,必須將值綁定到全部參數,不然將拋出一個SQLException異常。

若是有IN參數,只需遵循適用於PreparedStatement對象的相同規則和技術; 使用與綁定的Java數據類型相對應的setXXX()方法。

使用OUTINOUT參數時,必須使用一個額外的CallableStatement對象方法registerOutParameter()。 registerOutParameter()方法將JDBC數據類型綁定到存儲過程並返回預期數據類型。

當調用存儲過程,可使用適當的getXXX()方法從OUT參數中檢索該值。 此方法將檢索到的SQL類型的值轉換爲對應的Java數據類型。

關閉CallableStatement對象

就像關閉其餘Statement對象同樣,因爲一樣的緣由(節省數據庫系統資源),還應該關閉CallableStatement對象。

簡單的調用close()方法將執行關閉CallableStatement對象。 若是先關閉Connection對象,它也會關閉CallableStatement對象。 可是,應該始終顯式關閉CallableStatement對象,以確保按正確順序的清理資源。

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}
Java

爲了更好的理解,建議參考學習Callable示例代碼。

相關文章
相關標籤/搜索