JDBC (Java Database Connectivity) 定義了統一的數據庫訪問 API,屏蔽底層驅動差異。本文彙整主流數據庫的驅動類全名、JDBC URL 格式、連接代碼範本,並說明關鍵參數含義,方便開發者快速查閱複製。
// 1. 載入驅動 (JDBC 4.0+ 可省略,自動發現 META-INF/services/java.sql.Driver)
Class.forName(driverClassName);
// 2. 建立連接
Connection conn = DriverManager.getConnection(url, username, password);
// 3. 使用連接...
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) { /* 處理結果 */ }
}
// 4. 關閉連接 (建議使用 try-with-resources 自動管理)
| 數據庫 | 驅動類全名 | JDBC URL 範本 | 關鍵參數說明 | 備註 |
|---|---|---|---|---|
| MySQL (5.7/8.0) | com.mysql.cj.jdbc.Driver |
jdbc:mysql://host:port/dbname?useSSL=false&serverTimezone=UTC&characterEncoding=utf8 |
host: IP/域名 port: 預設 3306 dbname: 數據庫名 useSSL: 是否啟用 SSL serverTimezone: 時區 (8.0 必須) characterEncoding: 字符集 |
8.0+ 驅動包名變更為 com.mysql.cj,需注意時區設置 |
| PostgreSQL | org.postgresql.Driver |
jdbc:postgresql://host:port/dbname?currentSchema=public |
port: 預設 5432 currentSchema: 預設 schema |
支援 IPv6、Unix Socket、SSL 模式 |
| Oracle (Thin 模式) | oracle.jdbc.OracleDriver |
jdbc:oracle:thin:@//host:port/serviceName或 jdbc:oracle:thin:@host:port:SID |
serviceName: 服務名 (推薦) SID: 實例識別符 (舊版) port: 預設 1521 |
Thin 驅動純 Java,無需 Oracle Client;支援 TNSNAMES、LDAP、RAC |
| SQL Server (Microsoft 官方驅動) | com.microsoft.sqlserver.jdbc.SQLServerDriver |
jdbc:sqlserver://host:port;databaseName=dbname;encrypt=true;trustServerCertificate=false |
port: 預設 1433 databaseName: 數據庫名 encrypt: 加密連接 trustServerCertificate: 信任憑證 |
舊版 com.microsoft.jdbc.sqlserver.SQLServerDriver 已棄用 |
| DB2 (IBM) | com.ibm.db2.jcc.DB2Driver |
jdbc:db2://host:port/dbname:retrieveMessagesFromServerOnGetMessage=true; |
port: 預設 50000 retrieveMessagesFromServerOnGetMessage: 獲取詳細錯誤 |
需 db2jcc4.jar + db2jcc_license_cu.jar |
| Sybase ASE | com.sybase.jdbc4.jdbc.SybDriver |
jdbc:sybase:Tds:host:port/dbname |
port: 預設 5000 Tds: Tabular Data Stream 協議 |
jConnect 驅動需授權 |
| Informix | com.informix.jdbc.IfxDriver |
jdbc:informix-sqli://host:port/dbname:INFORMIXSERVER=servername |
INFORMIXSERVER: 伺服器名稱 | 支援 DRDA 協議 |
| SQLite (Xerial) | org.sqlite.JDBC |
jdbc:sqlite:/path/to/dbfile.db或 jdbc:sqlite::memory: (記憶體庫) |
無需伺服器,直接操作檔案 | 嵌入式應用首選,支援加密擴展 |
| H2 (嵌入/伺服器) | org.h2.Driver |
jdbc:h2:~/test (嵌入)jdbc:h2:tcp://host:port/~/test (伺服器) |
純 Java、支援 PostgreSQL/MySQL 相容模式 | 測試、輕量應用、內存數據庫首選 |
| JDBC-ODBC Bridge (JDK 8 移除) | sun.jdbc.odbc.JdbcOdbcDriver |
jdbc:odbc:dsnName |
dsnName: 系統 DSN 名稱 | 已淘汰,請改用原生驅動 |
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/myapp?useSSL=false&serverTimezone=UTC");
config.setUsername("user");
config.setPassword("pass");
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
config.setConnectionTimeout(30000); // 30秒獲取連接超時
config.setIdleTimeout(600000); // 10分鐘空閒回收
config.setMaxLifetime(1800000); // 30分鐘最大存活
config.setConnectionTestQuery("SELECT 1"); // 連接驗證查詢
config.setPoolName("MyApp-Pool");
HikariDataSource dataSource = new HikariDataSource(config);
// 使用: try (Connection conn = dataSource.getConnection()) { ... }
useSSL=true, encrypt=true)trustServerCertificate=false (生產) / true (測試自簽憑證)| 錯誤現象 | 可能原因 | 解決方案 |
|---|---|---|
ClassNotFoundException | 驅動 JAR 未在 classpath | Maven/Gradle 正確引入依賴 |
Communications link failure | 網路不通/防火牆/主機名解析失敗 | ping/telnet 測試、檢查 bind-address、使用 IP 代替主機名 |
Access denied for user | 用戶名/密碼錯誤/主機限制 | 確認權限:GRANT ALL ON db.* TO 'user'@'%' IDENTIFIED BY 'pass' |
Server timezone is unrecognized | MySQL 8.0 時區未設置 | URL 添加 serverTimezone=UTC 或 Asia/Shanghai |
Public Key Retrieval is not allowed | MySQL 8.0 caching_sha2_password 插件 | URL 添加 allowPublicKeyRetrieval=true (需 SSL) 或改用 mysql_native_password |
public interface DatabaseConfig {
String getDriverClassName();
String buildUrl(String host, int port, String database);
String getValidationQuery();
}
// MySQL 實現
public class MySQLConfig implements DatabaseConfig {
public String getDriverClassName() { return "com.mysql.cj.jdbc.Driver"; }
public String buildUrl(String host, int port, String db) {
return String.format("jdbc:mysql://%s:%d/%s?useSSL=false&serverTimezone=UTC", host, port, db);
}
public String getValidationQuery() { return "SELECT 1"; }
}
// 使用工廠模式動態選擇
public class DataSourceFactory {
public static DataSource create(DatabaseConfig config, String host, int port, String db, String user, String pass) {
HikariConfig cfg = new HikariConfig();
cfg.setDriverClassName(config.getDriverClassName());
cfg.setJdbcUrl(config.buildUrl(host, port, db));
cfg.setUsername(user);
cfg.setPassword(pass);
cfg.setConnectionTestQuery(config.getValidationQuery());
return new HikariDataSource(cfg);
}
}
掌握各數據庫 JDBC URL 格式與驅動類名是 Java 後端開發基礎技能。建議: