建立連接的本質就是獲取Connection對象,它的方式有兩種,
第一種,Driver方式,可以直接通過驅動類,也可以通過驅動管理器類。實際中不使用,只學習的時候,或編寫測試案例時使用。
第二種,DataSource,數據源,它是一個接口,第三方提供實現。它支持的功能完全由第三方實現,最常見的有連接池(通常命名爲XXPooledDataSource),分佈式(通常命名爲XADataSource)。本篇略,後續介紹C3P0和Hirika數據源。
獲取到Connection對象之後,可以查詢數據庫的元信息,執行SQL語句等。本篇只介紹查詢元信息。
本篇按照建立連接之前,連接對象本身,建立連接之後的順序,介紹三個階段中涉及到的核心對象。
1、Driver
驅動接口,全稱爲java.sql.Driver,數據庫廠商提供實現類。方法由三部分組成。建立連接,查詢信息,兼容性檢查。
1.1 建立連接
建立連接的步驟如下:
第一步,創建Driver對象。
Driver driver = new com.mysql.cj.jdbc.Driver();
第二步,調用connect方法。
Connection connection = driver.connect(url, properties);
url:數據庫的url地址,例如mysql地址:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
properties:連接時需要的屬性,用戶名和密碼是必須的,用戶名的屬性名稱爲user,密碼的屬性名稱爲password。
// 創建Driver對象, 實例化爲mysql Driver Driver driver = new com.mysql.cj.jdbc.Driver(); // 建立連接需要的url地址 String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"; // 設置連接的屬性 Properties properties = new Properties(); properties.put("user", "xx"); properties.put("password","xx"); // 獲取Connection對象 Connection connection = driver.connect(url, properties);
1.2 查詢信息
查詢版本信息,其他信息都封裝在DriverPropertyInfo中,查看它需要建立連接。
// 創建Driver對象, 實例化爲mysql Driver Driver driver = new com.mysql.cj.jdbc.Driver(); // 驅動主版本號, 返回8 log.info("驅動的主版本號:{}", driver.getMajorVersion()); // 驅動的次版本號, 返回3, 說明版本號爲8.3 log.info("驅動的次版本號:{}", driver.getMinorVersion()); // 建立連接需要的url地址 String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"; // 設置連接的屬性,用戶名,密碼 Properties properties = new Properties(); properties.put("user", "xx"); properties.put("password","xx"); // 其他信息,封裝對象DriverPropertyInfo。 log.info("驅動的其他屬性:{}", JSON.toJSONString(driver.getPropertyInfo(url, properties)));
1.3 兼容性
// 驅動是否支持url,返回布爾值 log.info("驅動是否匹配此url地址:{}", driver.acceptsURL(url)); // 是否完全支持jdbc規範。 log.info("驅動是否完全支持jdbc規範:{}", driver.jdbcCompliant());
2、DriverManager
DriverManager,驅動管理器,方法由三部分組成。管理驅動,建立連接,get & set屬性。
2.1 管理驅動
註冊驅動,查詢驅動,撤銷驅動。
註冊驅動有兩種方式。
顯示,調用DriverManager.registerDriver方法。
隱式,在驅動類加載時,設置jdbc.drivers虛擬機變量時,會自動註冊。
查詢驅動:
getDriver(url):根據url地址查詢驅動。
getDrivers():所有驅動列表。
撤銷驅動:調用deregisterDriver(driver)方法。
// 註冊驅動 DriverManager.registerDriver(driverInstance); // 第二種方式, 設置jdbc:drivers System.setProperty("jdbc:drivers","com.mysql.cj.jdbc.Driver"); // 查詢驅動信息 log.info("DriverManager根據url查詢驅動:{}", JSONArray.toJSONString(DriverManager.getDriver(url))); log.info("DriverManager查詢所有驅動:{}", JSONArray.toJSONString(DriverManager.getDrivers())); // 撤銷驅動 DriverManager.deregisterDriver(driverInstance);
2.2 建立連接
建立連接,遍歷已註冊的驅動,逐個適配url地址。有三個方法。
getConnection,
getConnection(url, prop),
getConnection(url, user, password)
2.3 get & set
超時時間:loginTimeout, 單位爲秒,當設置爲0時,沒有時間限制。
LogWriter:日誌的輸出流。
3、Connection
Connection, 連接對象,獲取該對象是後續任何操作的前提條件。它的方法由四部分組成。
執行sql:創建三種Statement對象。
查詢信息:獲取DatabaseMeta,查詢元信息。獲取ClientInfo,客戶端信息。
數據庫功能:是否自動提交,事務隔離級別,等等。
類型映射:JDBC與Java對象相互轉換時的映射關係,略。
3.1 執行sql
創建Statement對象,createStatement以及它的重寫。
創建PreparedStatement對象,prepareStatement以及它的重寫。
創建CallableStatement對象,prepareCall以及它的重寫。
3.2 查詢信息
元信息:
getDatabaseMetaData,所有元信息
catalog:get & set方法。catalog,數據庫名稱。
schema:get & set方法。schema名稱
客戶端信息: getClientInfo。
3.3 功能
事務相關:
隔離級別:get & setTransactionIsolation,返回值爲int。
是否只讀:布爾屬性readOnly的基礎方法。
存檔點:set & release & rollback。
回滾:rollback。
提交:布爾屬性autoCommit的基礎方法。commit方法。
其他:
是否關閉: isClosed,close關閉。
3.4 類型映射
TypeMap:get & set方法。第一個參數string爲數據庫類型,class爲Java對象類型。
4、DatabaseMetadata
元信息,主要有三類。
版本信息:數據庫版本,JDBC版本,驅動版本。
實例信息:catalog, schema, table, column等信息。
變量:各類數據庫的變量。
4.1 版本信息
// 數據庫版本 log.info("數據庫的廠商:{}", metaData.getDatabaseProductName()); log.info("數據庫的版本號:{}.{}", metaData.getDatabaseMajorVersion(), metaData.getDatabaseMinorVersion()); // 驅動版本號 log.info("Driver的名稱:{}", metaData.getDriverName()); log.info("Driver的版本:{}", metaData.getDriverVersion()); log.info("Driver的版本:{}.{}", metaData.getDriverMajorVersion(), metaData.getDriverMinorVersion()); // JDBC版本號 log.info("JDBC的版本號:{}.{}", metaData.getJDBCMajorVersion(), metaData.getJDBCMinorVersion());
4.2 實例信息
catalog-->schema--->table--->column(列定義信息等),只列舉了schema。
ResultSet schema = metaData.getCatalogs(); while (schema.next()){ // 數據庫信息 log.info("數據庫的schema:{}", schema.getString(1)); }
4.3 變量
連接信息
log.info("url:{}", metaData.getURL()); log.info("userName:{}", metaData.getUserName());
數據庫支持的函數。
log.info("所有的系統函數:{}", metaData.getSystemFunctions()); log.info("所有的數字函數:{}", metaData.getNumericFunctions()); log.info("所有的字符串函數:{}", metaData.getStringFunctions()); log.info("所有的日期函數:{}", metaData.getTimeDateFunctions());