JDBC 連接數據庫是 Java 後端開發的入門必修課。本文提供 Oracle 與 MySQL 兩大主流數據庫的標準連接代碼、驅動坐標、連接 URL 參數詳解、常見錯誤排查,可直接複製到項目中作為工具類基礎。
JDBC 通用三步走
- 加載驅動:
Class.forName("驅動全限定名")(JDBC 4.0+ 可省略,SPI 自動發現)。
- 獲取連接:
DriverManager.getConnection(url, user, pass)。
- 使用連接:創建 Statement/PreparedStatement 執行 SQL,最後關閉資源。
Oracle 數據庫連接
Maven 依賴(官方 JDBC 驅動)
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId> <!-- JDK 11+ 用 ojdbc11,JDK 8 用 ojdbc8 -->
<version>23.4.0.0</version>
</dependency>
舊版需從 Oracle 官網下載 ojdbc8.jar 手動 mvn install 到本地倉庫。
連接代碼模板
String url = "jdbc:oracle:thin:@//host:1521/service_name"; // 服務名模式(推薦)
// 或 SID 模式:jdbc:oracle:thin:@host:1521:sid
String user = "your_username";
String pass = "your_password";
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
// 業務邏輯
} catch (SQLException e) {
e.printStackTrace();
}
URL 參數詳解
| 部分 | 說明 | 示例 |
jdbc:oracle:thin | Thin 驅動(純 Java,無需 Oracle Client),標準選擇 | — |
@//host:port/service | 服務名連接(RAC/PDB 友好) | @//192.168.1.100:1521/orclpdb |
@host:port:sid | SID 連接(傳統單實例) | @192.168.1.100:1521:orcl |
TNS_ADMIN | 使用 tnsnames.ora 別名連接 | url=jdbc:oracle:thin:@mydb; -Doracle.net.tns_admin=/path/to/tns |
MySQL 數據庫連接
Maven 依賴
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId> <!-- 8.0+ 新坐標 -->
<version>8.3.0</version>
</dependency>
連接代碼模板
String url = "jdbc:mysql://localhost:3306/mydb?" +
"useSSL=false&" +
"serverTimezone=Asia/Shanghai&" +
"characterEncoding=utf-8&" +
"allowPublicKeyRetrieval=true"; // MySQL 8.0+ 公鑰獲取
String user = "root";
String pass = "password";
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
// 業務邏輯
}
關鍵 URL 參數對比(MySQL 5.1 vs 8.0+)
| 參數 | MySQL 5.1 | MySQL 8.0+ | 說明 |
| 驅動類 | com.mysql.jdbc.Driver | com.mysql.cj.jdbc.Driver | 包名變更 |
| 時區 | 不支持 serverTimezone | 必須設置 serverTimezone=Asia/Shanghai | 避免時間錯位 |
| SSL | 默認 false | 默認 true,建議 useSSL=false(內網) | 減少握手開銷 |
| 公鑰獲取 | 不需要 | allowPublicKeyRetrieval=true | caching_sha2_password 認證需公鑰 |
| 字符集 | characterEncoding=utf-8 | characterEncoding=utf-8 | 統一 UTF-8 |
通用工具類封裝建議
public class JdbcUtil {
private static final String URL = "...";
private static final String USER = "...";
private static final String PASS = "...";
static {
try { Class.forName("com.mysql.cj.jdbc.Driver"); }
catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); }
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASS);
}
public static void close(Connection conn, Statement stmt, ResultSet rs) {
closeQuietly(rs); closeQuietly(stmt); closeQuietly(conn);
}
private static void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignore) {}
}
}
生產環境必上:連接池
絕不在生產直接用 DriverManager(頻繁建連、無複用、無監控)。
- HikariCP(Spring Boot 2+ 默認):極速、輕量、參數少。
spring.datasource.hikari.* 配置。
- Druid(阿里):監控強、SQL 防火墻、日誌分析。
spring.datasource.druid.*。
常見錯誤速查
| 錯誤 | 原因 | 解決 |
ClassNotFoundException: Driver | 驅動 JAR 未在 classpath | Maven 依賴正確、scope=compile、打包含依賴 |
Communications link failure | IP/端口錯、防火牆攔截、數據庫未啟動 | telnet host port、檢查 security group、bind-address=0.0.0.0 |
ORA-12514: TNS listener does not know service | 服務名/ SID 錯誤 | tnsping、lsnrctl status 確認服務名、PDB 需用服務名 |
Public Key Retrieval is not allowed | MySQL 8.0 缺 allowPublicKeyRetrieval | URL 加 allowPublicKeyRetrieval=true |
Time zone value '...' unrecognized | MySQL 8.0 缺 serverTimezone | URL 加 serverTimezone=Asia/Shanghai |
總結
JDBC 連接核心:正確驅動坐標 + 標準 URL 參數 + 連接池。Oracle 注意 Thin 驅動與服務名模式;MySQL 8.0+ 必須設置時區、SSL、公鑰參數。封裝工具類時務必try-with-resources 自動關閉,生產環境直接上 HikariCP/Druid。驅動版本與數據庫版本對齊,是避免 90% 連接問題的關鍵。
- 上一篇文章: Mac 下 Java 開發環境配置全攻略:JDK、Tomcat、MySQL、IDE 一站式搭建
- 下一篇文章: Java 入門筆記 001:Windows 環境搭建、DOS 基礎命令、JDK 安裝驗證
Copyright ©
程式碼之家 All Rights Reserved