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

Java (JDBC) 連接 MySQL 完整教學:驅動載入、連線池、預處理與資源釋放

     編輯:MySQL 綜合教學

前言

JDBC 是 Java 存取關聯式資料庫的標準 API。本文說明 MySQL Connector/J 驅動載入方式、建立連線、執行查詢/更新、預處理語句防注入、資源正確釋放與連線池整合最佳實踐。

環境準備

  • JDK 8+
  • MySQL Connector/J (mysql-connector-java-x.x.x.jar) 加入 Classpath
  • Maven/Gradle 依賴管理 (推薦)

步驟 1:載入驅動 (JDBC 4.0+ 可省略)

// JDBC 4.0+ (Java 6+) 透過 SPI 自動載入,無需 Class.forName
// 相容舊版或顯式載入:
Class.forName("com.mysql.cj.jdbc.Driver");  // 8.0+ 驅動類別
// 旧版: com.mysql.jdbc.Driver

步驟 2:建立資料庫連線

String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8mb4";
String user = "root";
String password = "admin";

Connection conn = DriverManager.getConnection(url, user, password);

關鍵連線參數解析

  • useSSL=false:本地開發關閉 SSL 減少握手延遲
  • serverTimezone=UTC:避免時區警告
  • characterEncoding=utf8mb4:支援完整 Unicode (含 Emoji)
  • allowPublicKeyRetrieval=true:8.0+ 公開金鑰傳輸 (配合 caching_sha2_password)

步驟 3:執行 SQL 指令

查詢 (SELECT) - 使用 PreparedStatement

String sql = "SELECT * FROM pet";
try (Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {
    while (rs.next()) {
        System.out.println(rs.getString("name") + " " + rs.getString("owner"));
    }
}

更新 (INSERT/UPDATE/DELETE) - 必須用 PreparedStatement

String sql = "INSERT INTO pet (name, owner, species, sex, birth) VALUES (?, ?, ?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setString(1, "Fluffy");
    pstmt.setString(2, "Harold");
    pstmt.setString(3, "cat");
    pstmt.setString(4, "f");
    pstmt.setDate(5, Date.valueOf("2020-01-01"));
    int affected = pstmt.executeUpdate();
    System.out.println("影響行數: " + affected);
}

完整範例程式碼 (現代 try-with-resources 寫法)

import java.sql.*;

public class MySQLJdbcDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "admin";

        String sql = "SELECT name, owner FROM pet";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {

            while (rs.next()) {
                System.out.printf("%s %s%n", rs.getString("name"), rs.getString("owner"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

進階:連線池 (HikariCP - 現代標準)

// Maven 依賴

    com.zaxxer
    HikariCP
    5.0.1


// 配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC");
config.setUsername("root");
config.setPassword("admin");
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);

HikariDataSource ds = new HikariDataSource(config);

// 使用
try (Connection conn = ds.getConnection();
     PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM pet");
     ResultSet rs = pstmt.executeQuery()) {
    // ...
}

資源管理鐵律

  1. Connection、Statement、ResultSet 必須關閉 (try-with-resources 自動處理)
  2. 生產環境禁止直接建立連線,必須使用連線池
  3. 所有使用者輸入必須透過 PreparedStatement 參數綁定
  4. 異常堆疊資訊勿直接暴露給前端,記錄日誌後回傳通用錯誤碼

總結

JDBC 核心流程:載入驅動 → 取得連線 → 建立 PreparedStatement → 綁定參數 → 執行 → 處理 ResultSet → 釋放資源。現代開發請直接使用 HikariCP + PreparedStatement,並善用 try-with-resources 確保資源不洩漏。

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