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

Java JDBC 連接 MySQL 完整指南:驅動加載、連接池與最佳實踐

     編輯:Java 相關知識

核心步驟三部曲

  1. 加載驅動:`Class.forName("com.mysql.cj.jdbc.Driver")` (MySQL 8.0+)
  2. 建立連接:`DriverManager.getConnection(url, user, password)`
  3. 資源關閉:`try-with-resources` 自動關閉 Connection/Statement/ResultSet

標準代碼範本 (Java 7+)

import java.sql.*;

public class JdbcDemo {
    // 數據庫配置常量 (實際項目應放入配置文件/環境變量)
    private static final String URL = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";
    // MySQL 8.0+ 驅動類
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";

    public static void main(String[] args) {
        // 1. 加載驅動 (JDBC 4.0+ SPI 機制可省略,但建議顯式加載)
        try {
            Class.forName(DRIVER);
            System.out.println("驅動加載成功");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("找不到 MySQL 驅動,請檢查 maven 依賴", e);
        }

        // 2. try-with-resources 自動管理連接生命周期 (核心最佳實踐)
        String sql = "SELECT id, username, email FROM users WHERE id = ?";
        
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement ps = conn.prepareStatement(sql)) {
            
            // 3. 設置參數 (防止 SQL 注入)
            ps.setInt(1, 1001);
            
            // 4. 執行查詢
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String username = rs.getString("username");
                    String email = rs.getString("email");
                    System.out.printf("用戶: %d - %s - %s%n", id, username, email);
                }
            }
            
        } catch (SQLException e) {
            // 統一異常處理:記錄日誌、轉換為業務異常、事務回滾等
            System.err.println("數據庫操作失敗: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

關鍵配置參數解析 (URL 參數)

進階:生產環境必須使用連接池

頻繁創建/銷毀物理連接極其昂貴。主流連接池對比:

參數推薦值作用
useSSLfalse禁用 SSL (本地開發),生產環境建議 true 並配置憑證
serverTimezoneUTC / Asia/Shanghai解決時區不匹配導致時間偏移 (MySQL 8.0 必須)
characterEncodingutf8 / utf8mb4保證中文讀寫不亂碼
allowPublicKeyRetrievaltrueMySQL 8.0 caching_sha2_password 插件需開啟
rewriteBatchedStatementstrue批量插入性能優化 (關鍵!)
useServerPrepStmtstrue服務端預編譯,配合準備語句提升性能
連接池特點適用場景
HikariCP性能最強、輕量、Spring Boot 2.x 默認所有新項目首選
Druid監控強大、SQL 防火牆、阿里巴巴出品需要詳細 SQL 監控、防注入的國內項目
DBCP2Apache 老牌、穩定舊項目維護

HikariCP 配置範例 (application.yml)

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true
    username: root
    password: 123456
    hikari:
      minimum-idle: 5
      maximum-pool-size: 20
      auto-commit: true
      idle-timeout: 30000
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1
      pool-name: MyHikariPool

事務管理與異常處理最佳實踐

public void transfer(String from, String to, double amount) {
    Connection conn = null;
    try {
        conn = dataSource.getConnection(); // 從連接池獲取
        conn.setAutoCommit(false); // 開啟事務
        
        // 扣款
        updateBalance(conn, from, -amount);
        // 入賬
        updateBalance(conn, to, amount);
        
        conn.commit(); // 提交事務
    } catch (SQLException e) {
        if (conn != null) {
            try { conn.rollback(); } catch (SQLException ex) { log.error("回滾失敗", ex); }
        }
        throw new BusinessException("轉賬失敗", e);
    } finally {
        if (conn != null) {
            try { conn.close(); } catch (SQLException e) { log.error("關閉連接失敗", e); }
            // 連接池實現中 close() 實為歸還連接
        }
    }
}

// Spring @Transactional 註解方式更簡潔 (推薦)
@Transactional(rollbackFor = Exception.class)
public void transfer(String from, String to, double amount) {
    updateBalance(from, -amount);
    updateBalance(to, amount);
}

常見問題排查清單

  1. ClassNotFoundException:缺少 `mysql-connector-java` 依賴,或版本不匹配 (5.x vs 8.x 驅動類名不同)。
  2. Communications link failure:IP/端口錯誤、防火牆攔截、MySQL `bind-address` 未配置 0.0.0.0。
  3. Public Key Retrieval is not allowed:URL 加 `allowPublicKeyRetrieval=true`。
  4. 時區問題:URL 加 `serverTimezone=Asia/Shanghai`。
  5. 中文亂碼:URL 加 `characterEncoding=utf8mb4`,表字符集為 utf8mb4。
  6. 批量插入慢:URL 加 `rewriteBatchedStatements=true`,使用 `PreparedStatement.addBatch()`。

總結

JDBC 連接 MySQL 的核心在於:正確的驅動版本、完整的 URL 參數、連接池複用、PreparedStatement 防注入、try-with-resources/事務邊界管理。掌握這五點,即可構建穩健高效的數據訪問層。

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