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

JDBC 連接 MySQL 完整入門教程

     編輯:MySQL 綜合教學

JDBC 連接 MySQL 完整入門教程

JDBC (Java Database Connectivity) 是 Sun 定義的一套統一操作關係型資料庫的 API,由接口組成,具體實現由各資料庫廠商提供驅動包。本文從核心概念到完整代碼範例,手把手教你用 Java 操作 MySQL。

核心六步驟

  1. 載入驅動:Class.forName("com.mysql.cj.jdbc.Driver")(8.0+)或 com.mysql.jdbc.Driver(5.x)
  2. 建立連線:DriverManager.getConnection(url, user, pass)
  3. 創建 Statement:conn.createStatement() 或 conn.prepareStatement(sql)
  4. 執行 SQL:executeQuery(查詢)、executeUpdate(增刪改)
  5. 處理結果集:ResultSet.next() + getXxx()
  6. 釋放資源:finally 區塊關閉 rs、stmt、conn

完整可運行範例

package cn.test.jdbc.dao;

import java.sql.*;
import java.util.Date;
import java.util.Properties;
import com.mysql.cj.jdbc.Driver;

public class JDBCDemo {
    private static final String URL = "jdbc:mysql://localhost:3306/day15?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8";
    private static final String USER = "root";
    private static final String PASS = "your_password";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 1. 載入驅動(可選,JDBC 4.0+ 自動發現)
            // Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 建立連線
            conn = DriverManager.getConnection(URL, USER, PASS);

            // 3. 創建 Statement
            stmt = conn.createStatement();

            // 4. 執行查詢
            String sql = "SELECT id, name, password, email, birthday FROM student";
            rs = stmt.executeQuery(sql);

            // 5. 處理結果集
            System.out.println("id | name | password | email | birthday");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String pwd = rs.getString("password");
                String email = rs.getString("email");
                Date birthday = rs.getDate("birthday");
                System.out.printf("%d | %s | %s | %s | %s%n", id, name, pwd, email, birthday);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6. 釋放資源(逆序關閉)
            closeQuietly(rs);
            closeQuietly(stmt);
            closeQuietly(conn);
        }
    }

    private static void closeQuietly(AutoCloseable c) {
        if (c != null) try { c.close(); } catch (Exception ignore) {}
    }
}

關鍵細節深度解析

1. URL 格式與常用參數

jdbc:mysql://host:port/dbname?param1=value1¶m2=value2
常用參數:
  useSSL=false              # 開發環境關閉 SSL
  serverTimezone=UTC        # 避免時區警告
  characterEncoding=UTF-8   # 字符集
  autoReconnect=true        # 自動重連(生產慎用)
  rewriteBatchedStatements=true # 批次優化

2. Statement vs PreparedStatement

特性StatementPreparedStatement
SQL 注入防護無參數化查詢,安全
預編譯效能每次編譯預編譯,重複執行快
批次處理addBatch/executeBatch同樣支援,更高效
適用場景靜態 SQL、DDL動態參數、高頻執行

3. 事務控制

conn.setAutoCommit(false);
try {
    stmt.executeUpdate("INSERT ...");
    stmt.executeUpdate("UPDATE ...");
    conn.commit();
} catch (SQLException e) {
    conn.rollback();
    throw e;
} finally {
    conn.setAutoCommit(true);
}

4. ResultSet 游標操作

  • next():移至下一行(初始指向第一行之前)
  • previous()、absolute(row)、beforeFirst()、afterLast():需 TYPE_SCROLL_INSENSITIVE 或 TYPE_SCROLL_SENSITIVE

5. 防止 SQL 注入最佳實踐

  • 永遠使用 PreparedStatement 參數化查詢
  • 嚴禁字串拼接 SQL
  • 業務層做輸入驗證、長度限制
  • 最小權限資料庫賬號

常見問題排查

  • ClassNotFoundException:驅動包未加入 Classpath(Maven: mysql:mysql-connector-java)
  • Communications link failure:IP/端口錯誤、防火牆、MySQL bind-address 非 0.0.0.0
  • Public Key Retrieval is not allowed:URL 加 allowPublicKeyRetrieval=true(8.0+ caching_sha2_password)
  • 時區報警:URL 加 serverTimezone=Asia/Shanghai 或 UTC
生產環境請使用連接池(HikariCP、Druid),而非手動管理連接;並配合 Spring JdbcTemplate / MyBatis 等框架簡化樣板代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved