1. 程式人生 > 實用技巧 >【JDBC核心】獲取資料庫連線

【JDBC核心】獲取資料庫連線

獲取資料庫連線

要素一:Driver 介面實現類

Driver 介面

  • java.sql.Driver 介面是所有 JDBC 驅動程式需要實現的介面。這個介面是提供給資料庫廠商使用的,不同資料庫廠商提供不同的實現。
  • 在程式中不需要直接去訪問實現了 Driver 介面的類,而是由驅動程式管理器類(java.sql.DriverManager)去呼叫這些 Driver 實現。
    • Oracle的驅動:oracle.jdbc.driver.OracleDriver
    • MySQL的驅動: com.mysql.jdbc.Driver

載入並註冊 JDBC 驅動

  • 載入驅動:載入 JDBC 驅動需呼叫 Class 類的靜態方法 forName(),向其傳遞要載入的 JDBC 驅動的類名
    • Class.forName(“com.mysql.jdbc.Driver”);
  • 註冊驅動:DriverManager 類是驅動程式管理器類,負責管理驅動程式
    • 使用 DriverManager.registerDriver(com.mysql.jdbc.Driver) 來註冊驅動
    • 通常不用顯式呼叫 DriverManager 類的 registerDriver() 方法來註冊驅動程式類的例項,因為 Driver 介面的驅動程式類包含了靜態程式碼塊,在這個靜態程式碼塊中,會呼叫 DriverManager registerDriver() 方法來註冊自身的一個例項。

要素二:URL

JDBC URL 用於標識一個被註冊的驅動程式,驅動程式管理器通過這個 URL 選擇正確的驅動程式,從而建立到資料庫的連線。

JDBC URL的標準由三部分組成,各部分間用冒號分隔:

  • 協議:JDBC URL 中的協議總是 jdbc;
  • 子協議:子協議用於標識一個數據庫驅動程式;
  • 子名稱:一種標識資料庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位資料庫提供足夠的資訊。包含主機名(對應服務端的 ip 地址),埠號,資料庫名

常用 URL

  • MySQL 的連線 URL 編寫方式:
    • jdbc:mysql://主機名稱:mysql服務埠號/資料庫名稱?引數=值&引數=值
    • jdbc:mysql://localhost:3306/test
    • jdbc:mysql://localhost:3306/test**?useUnicode=true&characterEncoding=utf8
      (如果JDBC程式與伺服器端的字符集不一致,會導致亂碼,那麼可以通過引數指定伺服器端的字符集)
    • jdbc:mysql://localhost:3306/test?user=root&password=123456
  • Oracle 9i 的連線 URL 編寫方式:
    • jdbc:oracle:thin:@主機名稱:oracle服務埠號:資料庫名稱
    • jdbc:oracle:thin:@localhost:1521:test
  • SQLServer 的連線 URL 編寫方式:
    • jdbc:sqlserver://主機名稱:sqlserver服務埠號:DatabaseName=資料庫名稱
    • jdbc:sqlserver://localhost:1433:DatabaseName=test

要素三:使用者名稱和密碼

  • user、password 可以用“屬性名=屬性值”方式告訴資料庫;
  • 可以呼叫 DriverManager 類的 getConnection() 方法建立到資料庫的連線。

連線方式舉例

package cn.parzulpan.jdbc.ch02;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @Author : parzulpan
 * @Time : 2020-11-30
 * @Desc : 資料庫的連線
 */

public class ConnectionTest {

    // 連線方式一
    // 顯式出現了第三方資料庫的 API
    @Test
    public void test1() {
        try {
            // 1. 提供 java.sql.Driver 介面實現類的物件
            Driver driver = new com.mysql.jdbc.Driver();

            // 2. 提供 url,指明具體操作的資料
            String url = "jdbc:mysql://localhost:3306/test";

            // 3. 提供 Properties 的物件,指明使用者名稱和密碼
            Properties info = new Properties();
            info.setProperty("user", "root");
            info.setProperty("password", "root");

            // 4. 呼叫 driver 的 connect(),獲取連線
            Connection connect = driver.connect(url, info);
            System.out.println(connect);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 連線方式二
    // 使用反射例項化Driver,不在程式碼中體現第三方資料庫的API,體現了面向介面程式設計思想。
    @Test
    public void test2() {
        try {
            // 1. 例項化 Driver
            String className = "com.mysql.jdbc.Driver";
            Class<?> clazz = Class.forName(className);
            Driver driver = (Driver) clazz.newInstance();

            // 2. 提供 url,指明具體操作的資料
            String url = "jdbc:mysql://localhost:3306/test";

            // 3. 提供 Properties 的物件,指明使用者名稱和密碼
            Properties info = new Properties();
            info.setProperty("user", "root");
            info.setProperty("password", "root");

            // 4. 呼叫 driver 的 connect(),獲取連線
            Connection connect = driver.connect(url, info);
            System.out.println(connect);
        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | SQLException e) {
            e.printStackTrace();
        }
    }

    // 連線方式三
    // 使用 DriverManager
    @Test
    public void test3() {
        try {
            // 1. 三要素
            String driverName = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "root";

            // 例項化 Driver
            Class<?> clazz = Class.forName(driverName);
            Driver driver = (Driver) clazz.newInstance();

            // 3. 註冊驅動
            DriverManager.registerDriver(driver);

            // 4. 獲取連線
            Connection connection = DriverManager.getConnection(url, user, password);
            System.out.println(connection);
        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | SQLException e) {
            e.printStackTrace();
        }
    }

    // 連線方式四
    // 不用顯式註冊驅動,DriverManager 的原始碼中已經存在靜態程式碼塊,實現了驅動的註冊。
    @Test
    public void test4() {
        try {
            // 1. 三要素
            String driverName = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "root";

            // 例項化 Driver
            Class<?> clazz = Class.forName(driverName);
            Driver driver = (Driver) clazz.newInstance();

            // 3. 獲取連線
            Connection connection = DriverManager.getConnection(url, user, password);
            System.out.println(connection);
        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | SQLException e) {
            e.printStackTrace();
        }
    }

    // 連線方式五,推薦
    // 使用配置檔案的方式儲存配置資訊,在程式碼中載入配置檔案

    @Test
    public void test5() {
        try {
            // 1. 載入配置資訊
            InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties properties = new Properties();
            properties.load(is);

            // 2. 讀取配置資訊
            String user = properties.getProperty("user");
            String password = properties.getProperty("password");
            String url = properties.getProperty("url");
            String driverClass = properties.getProperty("driverName");

            // 3. 載入驅動
            Class.forName(driverClass);

            // 4. 獲取連線
            Connection connection = DriverManager.getConnection(url, user, password);
            System.out.println(connection);
        } catch (IOException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

總結,推薦連線方式五,使用配置檔案的方式儲存配置資訊,在程式碼中載入配置檔案。使用配置檔案的好處:

  • 實現了程式碼和資料的分離,如果需要修改配置資訊,直接在配置檔案中修改,不需要深入程式碼。
  • 如果修改了配置資訊,省去重新編譯的過程。

練習和總結