JDBC API 4.2(五):Statement 接口源碼分析

在本文中,我們將通過示例學習常用的JDBC 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章