mysql-connector-j-8.x.x.jar),放入專案 Classpath(Maven 專案直接加依賴)。<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
CREATE DATABASE IF NOT EXISTS `scutcs` DEFAULT CHARACTER SET utf8mb4;
USE `scutcs`;
CREATE TABLE `student` (
`sno` CHAR(7) NOT NULL PRIMARY KEY,
`sname` VARCHAR(20) NOT NULL,
`sex` CHAR(2) NOT NULL,
`bdate` DATE NOT NULL,
`height` DECIMAL(5,2) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `student` VALUES
('0104421','周遠行','男','1990-01-01',175.5),
('0208123','王義平','男','1991-02-02',170.0),
('0209120','何問起','女','1992-03-03',160.5);
package com.example.jdbc;
import java.sql.*;
public class JdbcDemo {
// MySQL 8.x 驅動類
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
// useSSL=false 關閉 SSL;serverTimezone=UTC 避免時區警告
private static final String URL = "jdbc:mysql://127.0.0.1:3306/scutcs?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASS = "root";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 加載驅動(JDBC 4.0+ 可省略,保留兼容)
Class.forName(DRIVER);
// 2. 建立連接
conn = DriverManager.getConnection(URL, USER, PASS);
System.out.println("✅ 資料庫連接成功!");
// 3. 創建 Statement
stmt = conn.createStatement();
// 4. 執行查詢
String sql = "SELECT sno, sname FROM student";
rs = stmt.executeQuery(sql);
// 5. 處理結果集
System.out.println("學號\t姓名");
System.out.println("-----------------");
while (rs.next()) {
String sno = rs.getString("sno");
// 關鍵:解決中文亂碼(舊版驅動可能需要)
// String sname = new String(rs.getBytes("sname"), "UTF-8");
String sname = rs.getString("sname"); // 新版驅動通常自動處理
System.out.println(sno + "\t" + sname);
}
} catch (ClassNotFoundException e) {
System.err.println("❌ 找不到驅動類:" + e.getMessage());
} catch (SQLException e) {
System.err.println("❌ SQL 執行異常:" + e.getMessage());
e.printStackTrace();
} finally {
// 6. 關鍵:按逆序關閉資源
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
}
}
private static void closeQuietly(AutoCloseable resource) {
if (resource != null) {
try { resource.close(); } catch (Exception ignored) {}
}
}
}
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| ClassNotFoundException | 驅動 JAR 未在 Classpath | Maven 加依賴;非 Maven 手動加 JAR 到 Build Path |
| Communications link failure | IP/端口錯誤、MySQL 未啟動、防火牆攔截 | 檢查 3306 端口、bind-address、防火牆規則 |
| Public Key Retrieval is not allowed | MySQL 8 密碼插件需 SSL 或公開金鑰 | URL 加 allowPublicKeyRetrieval=true 或配置 SSL |
| 中文亂碼 | 字符集不一致 | URL 指定 characterEncoding=utf8,表/庫用 utf8mb4 |
PreparedStatement 防 SQL 注入、利用預編譯緩存提升效能。stmt.setFetchSize(1000) 減少網絡交互。conn.setAutoCommit(false),配合 commit()/rollback()。掌握 JDBC 基礎流程是 Java 後端開發的必修課。實際專案中建議直接使用 MyBatis、JdbcTemplate 或 Spring Data JPA 等封裝框架,減少樣板代碼,專注業務邏輯。