1. 程式人生 > 實用技巧 >JDBC - 獲取資料庫連線

JDBC - 獲取資料庫連線

要素一: Driver介面實現類

Driver介面介紹

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

載入與註冊驅動

  • 載入驅動: 載入JDBC驅動需要呼叫Class類的靜態方法forName(), 向其傳遞要載入的JDBC驅動的類名
Class.forName("com.mysql.jdbc.Driver")
  • 註冊驅動: DriverManager類是驅動程式管理器類, 負責管理驅動程式
    • 使用DriverManage.registerDriver(com.mysql.jdbc.Driver)來註冊驅動
    • 通常不用顯式呼叫DriverManager類的registerDriver方法來註冊驅動程式類的例項, 因為Driver介面的驅動程式類都包含了靜態程式碼塊, 在這個靜態程式碼塊中, 會呼叫DriverManager.registerDriver()方法來註冊自身的一個例項,
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}

static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}

要素二: URL

  • JDBC URL用於標識一個用於被註冊的驅動程式, 驅動程式管理器用這個URL選擇正確的驅動程式, 從而建立到資料庫的連線
  • JDBC URL的標準由三部分組成, 各部分之間用冒號分隔
    • jdbc:子協議:子名稱
    • 協議: JDBC URL中的協議總是jdbc
    • 子協議: 子協議用於標識一個數據庫驅動程式
    • 子名稱: 一種標識資料庫的方法, 子名稱可以依不同的子協議而變化, 用子名稱的目的是為了定位資料庫提供足夠的資訊, 包含主機名(對應服務端的ip地址)、埠號、資料庫名
jdbc:mysql://localhost:3306/test
  • 幾種常用資料庫的JDBC URL
    • MySQL的連線URL編寫方式
      • jdbc:mysql://主機名稱:服務埠號/資料庫名稱?引數=值&引數=值
      • jdbc:mysql://localhost:3306/test
      • jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8(如果JDBC程式與服務端的字符集不一樣, 會導致亂碼, 那麼可以通過引數指定伺服器的字符集)
      • jdbc:mysql://localhost:3396/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()方法建立到資料庫的連線

資料庫連線方式

連線方式一

// 方式一
@Test
public void testConnection1() throws SQLException {

    // 獲取Driver的實現類物件
    Driver driver = new com.mysql.jdbc.Driver();

    // jdbc:mysql - 協議
    // localhost - ip地址
    // 3306 - 預設mysql的埠號
    // test - 資料庫名
    String url = "jdbc:mysql://localhost:3306/test";

    // 將使用者名稱和密碼封裝在Properties中
    Properties info = new Properties();
    info.setProperty("user", "root");
    info.setProperty("password", "nicaia...");

    Connection connection = driver.connect(url, info);

    System.out.println(connection);
}

連線方式二

// 方式二: 對方式一的迭代
// 目的: 在如下的程式中, 不出現第三方的api, 使得程式具有更好的移植性
@Test
public void testConnection2() throws Exception {

    // 1. 獲取Driver的實現類物件: 使用反射
    Class classzz = Class.forName("com.mysql.jdbc.Driver");
    Driver driver = (Driver) classzz.getConstructor().newInstance();


    // 2. 提供要連線的資料庫
    String url = "jdbc:mysql://localhost:3306/test";

    // 3. 提供連線需要的使用者名稱和密碼
    Properties info = new Properties();
    info.setProperty("user", "root");
    info.setProperty("password", "nicaia...");

    // 4. 獲取連線
    Connection connection = driver.connect(url, info);
    System.out.println(connection);
}

連線方式三

// 方式三: 使用DriverManager替代Driver
@Test
public void testConnection3() throws Exception {

    // 1. 獲取Driver的實現類物件
    Class classzz = Class.forName("com.mysql.jdbc.Driver");
    Driver driver = (Driver) classzz.getDeclaredConstructor().newInstance();

    // 3. 提供另外三個連線的基本資訊
    String url = "jdbc:mysql://localhost:3306/test";
    String user = "root";
    String password = "nicaia...";

    // 註冊
    DriverManager.registerDriver(driver);

    // 獲取連線
    Connection connection = DriverManager.getConnection(url, user, password);
    System.out.println(connection);
}

連線方式四

// 方式四: 優化, 可以只加載驅動, 不用顯式的去註冊驅動
@Test
public void testConnect4() throws Exception {

    // 1. 提供三個連線的基本資訊
    String url = "jdbc:mysql://localhost:3306/test";
    String user = "root";
    String password = "nicaia...";

    // 2. 載入Driver
    Class.forName("com.mysql.jdbc.Driver");

    // Driver driver = (Driver) classzz.getDeclaredConstructor().newInstance();
    // // 註冊驅動
    // DriverManager.registerDriver(driver);


    // 3. 獲取連線
    Connection connection = DriverManager.getConnection(url, user, password);
    System.out.println(connection);

}

連線方式五

 @Test
public void testConnect5() throws Exception {

    // 1. 讀取配置檔案中4個基本資訊
    InputStream inputStream = Connection.class.getClassLoader().getResourceAsStream("jdbc.properties");

    Properties properties = new Properties();
    properties.load(inputStream);

    String user = properties.getProperty("user");
    String password = properties.getProperty("password");
    String url = properties.getProperty("url");
    String driverClass = properties.getProperty("driverClass");

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

    // 3. 獲取連線
    Connection connection = DriverManager.getConnection(url, user, password);
    System.out.println(connection);
    }
}

其中,配置檔案宣告在工程的src目錄下:【jdbc.properties】

user=root
password=123456
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver

說明:使用配置檔案的方式儲存配置資訊,在程式碼中載入配置檔案

使用配置檔案的好處:

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