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

Java 通過 JDBC 連接 MySQL 數據庫完整指南

     編輯:Java 相關知識

JDBC 連接 MySQL 七大步驟

1. 加載 JDBC 驅動

try {
    Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+ 驅動類
} catch (ClassNotFoundException e) {
    throw new RuntimeException("找不到驅動類", e);
}

驅動加載成功後會自動註冊到 DriverManager。

2. 定義連接 URL

String url = "jdbc:mysql://localhost:3306/mydb?" +
             "useUnicode=true&characterEncoding=utf8&" +
             "useSSL=false&serverTimezone=Asia/Shanghai&" +
             "allowPublicKeyRetrieval=true";

3. 建立數據庫連接

String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);

4. 創建 Statement 對象

參數說明
useUnicode使用 Unicode 字符集
characterEncoding字符編碼,推薦 utf8/utf8mb4
useSSL是否使用 SSL,開發環境建議 false
serverTimezone服務器時區,避免時間差報錯
allowPublicKeyRetrievalMySQL 8.0 密碼插件需要
類型適用場景創建方式
Statement靜態 SQL,無參數conn.createStatement()
PreparedStatement參數化 SQL,防注入,預編譯conn.prepareStatement(sql)
CallableStatement調用存儲過程conn.prepareCall("{call proc(?,?)}")

5. 執行 SQL 語句

// 查詢 - executeQuery 返回 ResultSet
String sql = "SELECT id, name, age FROM users WHERE age > ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 18);
ResultSet rs = ps.executeQuery();

// 更新 - executeUpdate 返回影響行數
String insertSql = "INSERT INTO users(name, age) VALUES (?, ?)";
PreparedStatement ps2 = conn.prepareStatement(insertSql);
ps2.setString(1, "張三");
ps2.setInt(2, 25);
int rows = ps2.executeUpdate();

6. 處理結果集

while (rs.next()) {
    // 列索引從 1 開始,或使用列名
    int id = rs.getInt("id");
    String name = rs.getString("name");
    int age = rs.getInt("age");
    System.out.printf("ID: %d, Name: %s, Age: %d%n", id, name, age);
}

7. 關閉資源(逆序關閉)

// Java 7+ try-with-resources 自動關閉 (推薦)
try (Connection conn = DriverManager.getConnection(url, user, pwd);
     PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {
    
    // 業務邏輯
    
} catch (SQLException e) {
    e.printStackTrace();
}

// 手動關閉模板
finally {
    closeQuietly(rs);
    closeQuietly(ps);
    closeQuietly(conn);
}

void closeQuietly(AutoCloseable closeable) {
    if (closeable != null) {
        try { closeable.close(); } catch (Exception ignored) {}
    }
}

完整可運行示例

public class JdbcDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String pwd = "root";
        
        String sql = "SELECT * FROM users WHERE age > ?";
        
        try (Connection conn = DriverManager.getConnection(url, user, pwd);
             PreparedStatement ps = conn.prepareStatement(sql)) {
            
            ps.setInt(1, 20);
            
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println(rs.getInt("id") + " | " + 
                                     rs.getString("name") + " | " + 
                                     rs.getInt("age"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

常見問題與解決

  • 時區報錯:添加 serverTimezone=Asia/Shanghai
  • SSL 報錯:添加 useSSL=false 或配置憑證
  • 公鑰獲取失敗:添加 allowPublicKeyRetrieval=true
  • 中文亂碼:確保 characterEncoding=utf8 且數據庫表字符集一致
  • 連接泄漏:務必使用 try-with-resources 或 finally 關閉資源

進階:連接池優化

生產環境必須使用連接池(HikariCP、Druid、DBCP2),避免頻繁創建銷毀連接開銷:

// HikariCP 示例
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername(user);
config.setPassword(pwd);
config.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(config);

// 使用
try (Connection conn = ds.getConnection()) { ... }

掌握 JDBC 基礎操作,配合連接池與參數化查詢,是 Java 後端開發的核心必備技能。

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