Class.forName("com.mysql.cj.jdbc.Driver"); // 顯式載入驅動類
Connection conn = DriverManager.getConnection(url, user, pass);
Class.forName 觸發驅動類靜態初始化塊,驅動在 `DriverManager.registerDriver(new Driver()) 註冊自己。
驅動 JAR `META-INF/services/java.sql.Driver` 文件列出實現類全名。`DriverManager` 初始化時透過 `ServiceLoader` 自動發現並載入,**無需手動 `Class.forName`**。
import java.sql.*;
import java.util.Enumeration;
public class JdbcDriverLoader {
public static void main(String[] args) {
try {
// 1. 顯式載入 (兼容舊驅動)
Class.forName("com.mysql.cj.jdbc.Driver");
// 或 PostgreSQL: org.postgresql.Driver
// 或 H2: org.h2.Driver
// 2. 列出已註冊驅動
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver d = drivers.nextElement();
System.out.println("已載入驅動: " + d.getClass().getName()
+ " | 主版本: " + d.getMajorVersion()
+ " | 次版本: " + d.getMinorVersion()
+ " | JDBC 兼容: " + d.jdbcCompliant());
}
// 3. 測試連線 (需有效資料庫)
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "pwd");
// System.out.println("連線成功: " + conn.getMetaData().getDatabaseProductName());
}
catch (ClassNotFoundException e) {
System.err.println("驅動類未找到,請確認 JAR 在 Classpath: " + e.getMessage());
}
catch (SQLException e) {
System.err.println("驅動註冊/連線異常: " + e.getMessage());
}
}
}
| 現象 | 原因 | 解決 |
|---|---|---|
ClassNotFoundException | 驅動 JAR 不在 Classpath | Maven/Gradle 添加依賴,或手動加入 -cp |
No suitable driver found | JDBC URL 格式錯誤 / 驅動未註冊 | 檢查 URL 前綴 (jdbc:mysql://...),確認 SPI 文件存在 |
| 版本衝突 | 多版本驅動共存 (如 mysql-connector-java 5.x/8.x) | 統一版本,排除傳遞依賴 |
| 類載入器隔離 | 應用伺服器 (Tomcat/JBoss) 多層 ClassLoader | 驅動放在共享庫 ($CATALINA_HOME/lib) 或使用 Thread.currentThread().getContextClassLoader() |