JDBC 驅動載入是 Java 連線資料庫的第一步。本文詳細說明 Class.forName() 显式載入驅動的機制、DriverManager 管理驅動的原理,並提供完整可執行範例代碼。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
DriverManager.registerDriver(this)DriverManager 內部列表DriverManager.getConnection(url, user, pass)DriverManager 遍歷已註冊驅動acceptsURL(url) 判斷是否支援Connection 並返回Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
System.out.println(drivers.nextElement());
}
// 輸出範例:sun.jdbc.odbc.JdbcOdbcDriver@6ec12
import java.sql.*;
import java.util.*;
public class UseDBDriver {
public static void main(String[] args) {
try {
// 1. 显式載入 JDBC-ODBC 橋接驅動
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// 2. 列印所有已載入驅動
Enumeration<Driver> enumDrivers = DriverManager.getDrivers();
while (enumDrivers.hasMoreElements()) {
System.out.println(enumDrivers.nextElement());
}
} catch (Exception e) {
System.out.println("載入資料庫驅動發生異常: " + e.getMessage());
e.printStackTrace();
}
}
}
import java.sql.*; // JDBC 核心 API import java.util.*; // Enumeration
| 資料庫 | 驅動類名 | Maven 坐標 (範例) |
|---|---|---|
| MySQL | com.mysql.cj.jdbc.Driver | mysql:mysql-connector-java:8.0.33 |
| PostgreSQL | org.postgresql.Driver | org.postgresql:postgresql:42.6.0 |
| Oracle | oracle.jdbc.OracleDriver | com.oracle.database.jdbc:ojdbc11:23.4.0.0 |
| SQL Server | com.microsoft.sqlserver.jdbc.SQLServerDriver | com.microsoft.sqlserver:mssql-jdbc:12.4.2 |
| H2 | org.h2.Driver | com.h2database:h2:2.2.224 |
自 JDBC 4.0 (Java 6) 起,驅動 Jar 包含 META-INF/services/java.sql.Driver 檔案,列出驅動實作類名。DriverManager 會自動透過 ServiceLoader 發現並載入驅動,**無需手動呼叫 Class.forName()**。
// 現代寫法:直接獲取連線,驅動自動載入
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb?useSSL=false", "user", "pass");
Class.forName():依賴 SPI 自動載入Connection/Statement/ResultSet 關閉理解 JDBC 驅動載入機制有助於排查連線問題。雖然現代 SPI 機制已簡化流程,但在舊系統維護、自定義 ClassLoader 場景、驅動衝突排查時,显式 Class.forName() 仍具參考價值。生產環境務必搭配連線池使用。