【JDBC核心】獲取資料庫連線
阿新 • • 發佈:2020-12-13
獲取資料庫連線
要素一: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”);
- 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: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();
}
}
}
總結,推薦連線方式五,使用配置檔案的方式儲存配置資訊,在程式碼中載入配置檔案。使用配置檔案的好處:
- 實現了程式碼和資料的分離,如果需要修改配置資訊,直接在配置檔案中修改,不需要深入程式碼。
- 如果修改了配置資訊,省去重新編譯的過程。