在本文中,我們將通過示例學習常用的JDBC Statement接口方法。
文章目錄
- 1、簡述
- 2、Statement 類圖
- 3、Statement 接口常用方法
- 3.1、boolean execute(String sql) throws SQLException
- 3.2、boolean execute(String sql,int autoGeneratedKeys) throws SQLException
- 3.3、boolean execute(String sql,int[] columnIndexes) throws SQLException
- 3.4、boolean execute(String sql,String[] columnNames) throws SQLException
- 3.5、int[] executeBatch() throws SQLException
- 3.6、ResultSet executeQuery(String sql) throws SQLException
- 3.7、int executeUpdate(String sql) throws SQLException
- 3.8、int executeUpdate(String sql,int autoGeneratedKeys) throws SQLException
- 3.9、int executeUpdate(String sql,int[] columnIndexes) throws SQLException
- 3.10、int executeUpdate(String sql,String[] columnNames) throws SQLException
- 4、Statement 接口示例
1、簡述
Statement 用於執行靜態SQL語句並返回其產生的結果的對象。
默認情況下,每個Statement對象只能同時打開一個ResultSet對象。 因此,如果一個ResultSet對象的讀取與另一個對象的讀取是交錯的,則每個都必須由不同的Statement對象生成。 如果存在打開的語句,Statement接口中的所有執行方法都會隱式關閉該語句的當前ResultSet對象。
2、Statement 類圖
3、Statement 接口常用方法
3.1、boolean execute(String sql) throws SQLException
執行給定的SQL語句,該語句可能返回多個結果。 在某些(不常見)情況下,單個SQL語句可能返回多個結果集。 通常,除非您(1)執行您知道可能會返回多個結果的存儲過程,或者(2)您正在動態執行未知的SQL字符串,否則您可以忽略此設置。
注意:不能在PreparedStatement或CallableStatement上調用此方法。
3.2、boolean execute(String sql,int autoGeneratedKeys) throws SQLException
執行給定的SQL語句,該語句可能返回多個結果,並向驅動程序發出信號,告知應自動生成鍵。 如果SQL語句不是INSERT語句,或者不是能夠返回自動生成的鍵的SQL語句,驅動程序將忽略此信號。
在某些(不常見)情況下,單個SQL語句可能返回多個結果集。 通常,除非您(1)執行您知道可能會返回多個結果的存儲過程,或者(2)您正在動態執行未知的SQL字符串,否則您可以忽略此設置。
autoGeneratedKeys: 一個常量,指示是否應使用getGeneratedKeys方法自動生成鍵;
3.3、boolean execute(String sql,int[] columnIndexes) throws SQLException
執行給定的SQL語句,該語句可能返回多個結果,並向驅動程序發出信號,使用給定數組中指示的自動生成的鍵用於檢索。 該數組包含目標表中各列的索引,這些列包含應提供的自動生成的鍵。 如果SQL語句不是INSERT語句,或者不是能夠返回自動生成的鍵的SQL語句,驅動程序將忽略該數組。
注意:不能在PreparedStatement或CallableStatement上調用此方法。
columnIndexes: 插入行中列索引的數組,應該通過調用方法getGeneratedKeys使它們可供檢索
3.4、boolean execute(String sql,String[] columnNames) throws SQLException
執行給定的SQL語句,該語句可能返回多個結果,並向驅動程序發出信號,使給定數組中指示的自動生成的鍵可用於檢索。 該數組包含目標表中包含自動生成的鍵的列的名稱。 如果SQL語句不是INSERT語句,或者不是能夠返回自動生成的鍵的SQL語句,驅動程序將忽略該數組。
columnNames: 插入行中各列名稱的數組,應通過調用方法getGeneratedKeys使它們可供檢索
注意:不能在PreparedStatement或CallableStatement上調用此方法。
3.5、int[] executeBatch() throws SQLException
將一批命令提交給數據庫執行,如果所有命令都成功執行,則返回更新計數數組。 返回數組的int元素的順序與批處理中的命令相對應,這些命令根據將它們添加到批處理中的順序進行排序。
由executeBatch方法返回的數組中的元素可以是以下之一:
1、大於或等於零的數字,表示命令已成功處理,並且是更新計數,給出了數據庫中受命令執行影響的行數
2、SUCCESS_NO_INFO 的值,表示命令已成功處理,但受影響的行數未知
如果批處理更新中的命令之一無法正確執行,則此方法將引發BatchUpdateException,並且JDBC驅動程序可能會或可能不會繼續處理批處理中的其餘命令。 但是,驅動程序的行爲必須始終與特定的DBMS保持一致,要麼始終繼續處理命令,要麼永遠不繼續處理命令。 如果驅動程序在失敗後繼續處理,則由BatchUpdateException.getUpdateCounts方法返回的數組將包含與批處理中的命令一樣多的元素
3、EXECUTE_FAILED 的值,表示命令執行失敗,僅當驅動程序在命令失敗後繼續處理命令時纔會發生
3.6、ResultSet executeQuery(String sql) throws SQLException
執行給定的SQL語句,該語句返回一個ResultSet對象。
注意:不能在PreparedStatement或CallableStatement上調用此方法。
3.7、int executeUpdate(String sql) throws SQLException
執行給定的SQL語句,該語句可以是INSERT,UPDATE或DELETE語句,也可以是不返回任何內容的SQL語句,例如SQL DDL語句。
注意:不能在PreparedStatement或CallableStatement上調用此方法。
3.8、int executeUpdate(String sql,int autoGeneratedKeys) throws SQLException
執行給定的SQL語句,並用給定的標誌向驅動程序發出有關是否應使此Statement對象產生的自動生成的鍵可用於檢索的信號。 如果SQL語句不是INSERT語句,或者不是能夠返回自動生成的鍵的SQL語句,驅動程序將忽略該標誌。
注意:不能在PreparedStatement或CallableStatement上調用此方法。
3.9、int executeUpdate(String sql,int[] columnIndexes) throws SQLException
執行給定的SQL語句並向驅動程序發送信號,使給定數組中指示的自動生成的鍵可用於檢索。 該數組包含目標表中各列的索引,這些列包含應提供的自動生成的鍵。 如果SQL語句不是INSERT語句,或者不是能夠返回自動生成的鍵的SQL語句,驅動程序將忽略該數組。
columnIndexes: 列索引數組,指示應從插入的行返回的列
注意:不能在PreparedStatement或CallableStatement上調用此方法。
3.10、int executeUpdate(String sql,String[] columnNames) throws SQLException
執行給定的SQL語句並向驅動程序發送信號,使給定數組中指示的自動生成的鍵可用於檢索。 該數組包含目標表中包含自動生成的鍵的列的名稱,這些鍵應使其可用。 如果SQL語句不是INSERT語句,或者不是能夠返回自動生成的鍵的SQL語句,驅動程序將忽略該數組。
sql: SQL數據操作語言(DML)語句,例如INSERT,UPDATE或DELETE; 或不返回任何內容的SQL語句,例如DDL語句。
columnNames: 插入行應返回的列名稱的數組
注意:不能在PreparedStatement或CallableStatement上調用此方法。
4、Statement 接口示例
在此示例中,我們將使用executeQuery()方法通過JDBC Statement接口從數據庫表中檢索記錄。
private static final String QUERY_SQL = "select id,name,email,country,password from Users";
public static void main(String[] args) {
// Step 1: 創建 Connection
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
"root", "root");
// Step 2:創建 statement
Statement stmt = conn.createStatement();
// Step 3: 執行SQL
ResultSet rs = stmt.executeQuery(QUERY_SQL)) {
// Step 4: 處理 ResultSet 結果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
String country = rs.getString("country");
String password = rs.getString("password");
System.out.println(id + "," + name + "," + email + "," + country + "," + password);
}
} catch (SQLException e) {
printSQLException(e);
}
// Step 4: try-with-resource 語句將自動關閉連接。
}
public static void printSQLException(SQLException ex) {
for (Throwable e: ex) {
if (e instanceof SQLException) {
e.printStackTrace(System.err);
System.err.println("SQLState: " + ((SQLException) e).getSQLState());
System.err.println("Error Code: " + ((SQLException) e).getErrorCode());
System.err.println("Message: " + e.getMessage());
Throwable t = ex.getCause();
while (t != null) {
System.out.println("Cause: " + t);
t = t.getCause();
}
}
}
}
參考資料:
https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html