首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JDBC 驅動載入與資料庫連線實作詳解

     編輯:Java 相關知識

前言

JDBC 驅動載入是 Java 連線資料庫的第一步。本文詳細說明 Class.forName() 显式載入驅動的機制、DriverManager 管理驅動的原理,並提供完整可執行範例代碼。

核心機制

1. 显式載入驅動

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  • 觸發驅動類的靜態初始化區塊
  • 驅動類建構子中會呼叫 DriverManager.registerDriver(this)
  • 驅動註冊至 DriverManager 內部列表

2. DriverManager 獲取連線流程

  1. 應用呼叫 DriverManager.getConnection(url, user, pass)
  2. DriverManager 遍歷已註冊驅動
  3. 呼叫各驅動 acceptsURL(url) 判斷是否支援
  4. 第一個接受的驅動建立 Connection 並返回

3. 查看已載入驅動

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 坐標 (範例)
MySQLcom.mysql.cj.jdbc.Drivermysql:mysql-connector-java:8.0.33
PostgreSQLorg.postgresql.Driverorg.postgresql:postgresql:42.6.0
Oracleoracle.jdbc.OracleDrivercom.oracle.database.jdbc:ojdbc11:23.4.0.0
SQL Servercom.microsoft.sqlserver.jdbc.SQLServerDrivercom.microsoft.sqlserver:mssql-jdbc:12.4.2
H2org.h2.Drivercom.h2database:h2:2.2.224

重要演進:JDBC 4.0+ 服務提供者機制 (SPI)

自 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");

最佳實踐建議

  1. 現代專案省略 Class.forName():依賴 SPI 自動載入
  2. 使用連線池:HikariCP、Druid、DBCP2,避免頻繁建立連線
  3. 參數化配置:URL、用戶、密碼外部化至配置檔
  4. 關閉資源:使用 try-with-resources 確保 Connection/Statement/ResultSet 關閉

常見問題排查

  • ClassNotFoundException:驅動 Jar 未在 Classpath 中
  • No suitable driver found:URL 格式錯誤或驅動未載入
  • 通訊鏈路失敗:檢查主機、埠、防火牆、資料庫服務狀態

總結

理解 JDBC 驅動載入機制有助於排查連線問題。雖然現代 SPI 機制已簡化流程,但在舊系統維護、自定義 ClassLoader 場景、驅動衝突排查時,显式 Class.forName() 仍具參考價值。生產環境務必搭配連線池使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved