JDBC API 4.2(四):Connection 接口源碼分析

在本文中,我們將討論如何創建Connection以及如何使用Connection接口連接到特定數據庫。

1、簡述

Connection 是Java應用程序和特定數據庫之間的會話。 用來執行SQL語句,並在連接的上下文中返回結果。

連接到數據庫的 Connection 對象能夠提供數據表的描述信息、當前連接數據庫支持的SQL語法、存儲過程等相關功能信息。這些信息的獲取可以通過 getMetaData 方法獲得。

與數據庫的連接創建後,JDBC應用程序應使用適當的連接方法,例如setAutoCommit或setTransactionIsolation。 如果已經存在JDBC的方法可用,則應用程序不應直接調用SQL命令來更改連接的配置。 默認情況下,Connection 對象處於自動提交模式,這意味着它在執行每個語句後將自動提交更改。 如果已禁用自動提交模式,則必須顯式調用方法提交才能提交更改;否則,將不會保存對數據庫更改。

使用JDBC 2.1核心API創建的Connection對象具有與其初始關聯的空類型映射。 用戶可以在此類型映射中爲UDT輸入自定義映射。 使用ResultSet.getObject方法從數據源檢索UDT時,getObject方法將檢查連接的類型映射以查看是否存在該UDT的條目。 如果是這樣,則getObject方法將把UDT映射到所指示的類。 如果沒有條目,則將使用標準映射來映射UDT。

用戶可以創建一個新的類型映射,它是一個java.util.Map對象,將其傳遞給可執行自定義映射的java.sql方法。 在這種情況下,該方法將使用給定的類型映射,而不是與連接關聯的映射。

例如,以下代碼片段指定將SQL類型ATHLETES映射爲Java編程語言中的Athletes類。

 java.util.Map map = con.getTypeMap();
      map.put("mySchemaName.ATHLETES", Class.forName("Athletes"));
      con.setTypeMap(map);

2、Connection 類圖

下面的類圖顯示了Connection 接口提供的API的列表。

在這裏插入圖片描述

3、Connection 接口常用方法

3.1、createStatement()

創建一個Statement對象,用於將SQL語句發送到數據庫。 不帶參數的SQL語句通常使用Statement對象執行。 如果多次執行同一條SQL語句,則使用PreparedStatement對象可能會更合適。

默認情況下,使用返回的Statement對象創建的結果集的類型爲TYPE_FORWARD_ONLY,併發級別爲CONCUR_READ_ONLY。 可以通過調用getHoldability()確定創建的結果集的可保存性。

3.2、createStatement(int resultSetType, int resultSetConcurrency)

創建一個Statement對象,該對象將生成具有給定類型和併發性的ResultSet對象。 此方法與上面的createStatement方法相同,但是它允許覆蓋默認結果集類型和併發性。 可以通過調用getHoldability()確定創建的結果集的可保存性。

resultSetType: 結果集類型; ResultSet.TYPE_FORWARD_ONLY,ResultSet.TYPE_SCROLL_INSENSITIVE或ResultSet.TYPE_SCROLL_SENSITIVE中的一種

resultSetConcurrency: 併發類型; ResultSet.CONCUR_READ_ONLY或ResultSet.CONCUR_UPDATABLE之一

3.3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)

創建一個Statement對象,該對象將生成具有指定類型,併發性和可保存性的ResultSet對象。 此方法與上面的createStatement方法相同,但是它允許覆蓋默認結果集類型,併發性和可保存性。

resultSetType: 結果集類型, ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE 中的一種。

resultSetConcurrency: 併發類型 ,ResultSet.CONCUR_READ_ONLY、ResultSet.CONCUR_UPDATABLE 中的一種。

resultSetHoldability: 可保存性類型, ResultSet.HOLD_CURSORS_OVER_COMMIT 、ResultSet.CLOSE_CURSORS_AT_COMMIT 中的一種。

3.4、void setAutoCommit(boolean autoCommit) throws SQLException

將此連接的自動提交模式設置爲給定狀態。 如果連接處於自動提交模式,則其所有SQL語句將作爲單個事務執行並提交。 否則,將其SQL語句分組爲事務,這些事務通過調用方法提交或方法回滾而終止。 默認情況下,新連接處於自動提交模式。

autoCommit: true-開啓自動提交模式;false-關閉自動提交模式。

語句完成時,將進行提交。 語句完成的時間取決於SQL語句的類型:

  • 對於插入,更新或刪除之類的DML語句以及DDL語句,該語句在完成執行後即完成。
  • 對於Select語句,當關聯的結果集關閉時,該語句完成。
  • 對於CallableStatement對象或返回多個結果的語句,當所有關聯的結果集都已關閉且所有更新計數和輸出參數均已獲取時,該語句將完成。

注意:如果在事務期間調用此方法,更改了自動提交模式,則會立即提交事務。如果調用setAutoCommit 方法且自動提交模式未更改,則該調用爲無效操作。

3.5、void commit() throws SQLException

使自上一次提交/回退(commit/rollback)以來進行的所有更改永久生效,並釋放此Connection對象當前持有的所有數據庫鎖。 僅當禁用自動提交模式時,才使用此方法。

3.6、void rollback() throws SQLException

撤消在當前事務中進行的所有更改,並釋放此Connection對象當前持有的所有數據庫鎖。 僅當禁用自動提交模式時,才使用此方法。

3.7、void close() throws SQLException

立即釋放此Connection對象的數據庫和JDBC資源,而不是等待它們自動釋放。在已經關閉的Connection對象上調用close方法是無效的。

強烈建議應用程序在調用close方法之前顯式提交或回滾活動事務。

4、Connection 接口示例

 private static final String createTableSQL = "create table Users(\r\n" + "  id  int(3) primary key,\r\n" +
            "  name varchar(20),\r\n" + "  email varchar(20),\r\n" + "  country varchar(20),\r\n" +
            "  password varchar(20)\r\n" + "  );";

    public static void main(String[] argv) throws SQLException {
        createTable();
    }

    public static void createTable() throws SQLException {
        System.out.println(createTableSQL);
        // Step 1: 創建 Connection
        try (Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
                "root", "root");

             // Step 2:使用 connection 創建 statement 對象
             Statement statement = conn.createStatement();) {

            // Step 3: 執行SQL語句
            statement.execute(createTableSQL);
        } catch (SQLException e) {

        }
        // Step 4: 使用 try-with-resource 將自動關閉 conn.
    }

參考資料:

https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html

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