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

Java 連接 MySQL 實戰指南:從 JDBC 基礎到完整 CRUD 範例

     編輯:MySQL 綜合教學

Java 連接 MySQL 實戰指南

本文完整示範如何使用 JDBC (Java Database Connectivity) 連接 MySQL 資料庫,涵蓋驅動載入、連線建立、Statement/PreparedStatement 操作、結果集處理、資源關閉與完整的 Maven 專案結構範例。

前置準備

  1. MySQL JDBC 驅動:Maven 專案加入依賴(版本對應 MySQL 版本):
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>  <!-- 8.0+ 使用此坐標 -->
        <version>8.0.33</version>
    </dependency>
    
  2. 確認 MySQL 服務運行中,且目標資料庫/表已建立。

核心步驟詳解

1. 載入驅動 (JDBC 4.0+ 可省略,自動發現)

Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0+ 驅動類名
// 舊版:com.mysql.jdbc.Driver

2. 建立連線

String url = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
String user = "root";
String pwd  = "your_password";
Connection conn = DriverManager.getConnection(url, user, pwd);

關鍵 URL 參數:

  • useSSL=false:本地開發關閉 SSL 避免警告
  • serverTimezone=UTC:解決時區差異導致的時間錯誤
  • characterEncoding=utf8:指定字符編碼
  • allowPublicKeyRetrieval=true:MySQL 8.0+ caching_sha2_password 認證需求

3. 執行 SQL — 推薦 PreparedStatement

優點: 防 SQL 注入、預編譯效能更好、支援批次操作。

// 插入
String sql = "INSERT INTO stu(name, age, xuehao) VALUES (?, ?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "XiaoMing");
ps.setInt(2, 23);
ps.setInt(3, 7);
int rows = ps.executeUpdate();

// 查詢
String qsql = "SELECT id, name, age, xuehao FROM stu";
ResultSet rs = ps.executeQuery(qsql);
List list = new ArrayList<>();
while (rs.next()) {
    Stu s = new Stu();
    s.setId(rs.getInt("id"));
    s.setName(rs.getString("name"));
    s.setAge(rs.getInt("age"));
    s.setXuehao(rs.getInt("xuehao"));
    list.add(s);
}

4. 完整範例:DAO 模式封裝

public class StudentDAO {
    private DataSource dataSource; // 生產環境建議使用連線池 (HikariCP/Druid)

    public StudentDAO(DataSource ds) { this.dataSource = ds; }

    public void insert(Student s) throws SQLException {
        String sql = "INSERT INTO stu(name, age, xuehao) VALUES (?, ?, ?)";
        try (Connection conn = dataSource.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setString(1, s.getName());
            ps.setInt(2, s.getAge());
            ps.setInt(3, s.getXuehao());
            ps.executeUpdate();
        }
    }

    public List findAll() throws SQLException {
        String sql = "SELECT id, name, age, xuehao FROM stu";
        List list = new ArrayList<>();
        try (Connection conn = dataSource.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql);
             ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                list.add(mapRow(rs));
            }
        }
        return list;
    }

    private Student mapRow(ResultSet rs) throws SQLException {
        Student s = new Student();
        s.setId(rs.getInt("id"));
        s.setName(rs.getString("name"));
        s.setAge(rs.getInt("age"));
        s.setXuehao(rs.getInt("xuehao"));
        return s;
    }
}

關鍵最佳實踐

  • 務必使用 try-with-resources (Java 7+) 自動關閉 Connection/Statement/ResultSet,防止洩漏。
  • 生產環境必須配置連線池 (HikariCP 首選),避免頻繁建立/銷毀連線開銷。
  • 參數化查詢 全程使用 ? 佔位符,拒絕字符串拼接 SQL。
  • 事務控制:conn.setAutoCommit(false) → 執行多條 SQL → conn.commit() / conn.rollback()。
  • 異常處理:捕獲 SQLException 並轉換為業務異常,記錄完整堆棧資訊。

實體類 (POJO) 規範

public class Student implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
    private Integer xuehao;
    // 全欄位構造器、無參構造器、getter/setter、toString()
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved