首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Java JDBC 連線 MySQL 完整範例:驅動安裝、CRUD 操作與資源關閉最佳實踐

     編輯:MySQL 綜合教學

Java JDBC 連線 MySQL 完整範例:驅動安裝、CRUD 操作與資源關閉最佳實踐

從 Maven 依賴、驅動類載入、Connection/Statement/ResultSet 生命週期管理,到預編譯防注入,完整示範。

1. Maven 依賴 (MySQL 8.0+)

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.2.0</version>
</dependency>

舊版 5.1 使用 mysql-connector-java,驅動類為 com.mysql.jdbc.Driver;8.0+ 為 com.mysql.cj.jdbc.Driver。

2. 完整 CRUD 範例 (Try-with-resources 自動關閉)

package com.example.demo;

import java.sql.*;

public class JdbcDemo {
    private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
    private static final String USER = "root";
    private static final String PASS = "your_password";

    public static void main(String[] args) {
        // 1. 載入驅動(Java 6+ SPI 自動載入,可省略)
        // Class.forName("com.mysql.cj.jdbc.Driver");

        String sqlInsert = "INSERT INTO student(sno, sname, sex) VALUES (?, ?, ?)";
        String sqlQuery  = "SELECT sno, sname, sex FROM student";

        try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
             PreparedStatement psInsert = conn.prepareStatement(sqlInsert);
             PreparedStatement psQuery  = conn.prepareStatement(sqlQuery);
             ResultSet rs = psQuery.executeQuery()) {

            // 關閉自動提交,示範事務
            conn.setAutoCommit(false);

            // 批次插入
            for (int i = 1; i <= 3; i++) {
                psInsert.setInt(1, 2023000 + i);
                psInsert.setString(2, "學生" + i);
                psInsert.setString(3, i % 2 == 0 ? "女" : "男");
                psInsert.addBatch();
            }
            psInsert.executeBatch();
            conn.commit();
            System.out.println("批次插入提交成功");

            // 查詢
            System.out.printf("%-10s %-10s %s%n", "學號", "姓名", "性別");
            while (rs.next()) {
                System.out.printf("%-10d %-10s %s%n",
                    rs.getInt("sno"),
                    rs.getString("sname"),
                    rs.getString("sex"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3. 關鍵最佳實踐

  • 預編譯 PreparedStatement:防 SQL 注入、執行計畫快取、批次執行 addBatch/executeBatch。
  • Try-with-resources (Java 7+):自動關閉 Connection/Statement/ResultSet,杜絕洩漏。
  • 連線池:生產必須用 HikariCP / Druid,配置 maximumPoolSize、idleTimeout、connectionTestQuery。
  • 事務控制:conn.setAutoCommit(false)、commit()/rollback(),業務邏輯完成後提交。
  • URL 參數:useSSL=false、serverTimezone=UTC、characterEncoding=utf8、allowPublicKeyRetrieval=true(8.0+ 公鑰獲取)。
  • 異常處理:捕獲 SQLException,記錄 SQLState、ErrorCode、堆疊,區分死鎖/鎖等待/資料截斷等可重試錯誤。

4. 常見坑點

現象原因解決
ClassNotFoundException驅動包未在 classpath檢查 Maven 依賴打包
Communications link failureIP/Port/防火牆/服務未啟動telnet 驗證連通性
Public Key Retrieval is not allowed8.0+ caching_sha2_password 需公開鑰URL 加 allowPublicKeyRetrieval=true 或改用 mysql_native_password
資料截斷 Data truncation欄位長度/型別不符對齊實體類與表結構

總結

JDBC 基礎雖簡單,但資源管理、連線池調優、預編譯防注入、事務邊界控制、異常重試策略,每一環都關係系統穩定。建立團隊統一的 DAO 規範與 BaseRepository,事半功倍。

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