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

JDBC 核心操作完整範例:連線、查詢、交易與連線池

     編輯:Java 相關知識

JDBC 快速入門四步驟

  1. 載入驅動:Class.forName("com.mysql.cj.jdbc.Driver") (JDBC 4.0+ 可省略)
  2. 建立連線:DriverManager.getConnection(url, user, pass)
  3. 執行 SQL:Statement / PreparedStatement / CallableStatement
  4. 處理結果/釋放資源:ResultSet 讀取後必須 close()

完整 CRUD 範例 (MySQL)

public class JdbcDemo {
    static final String URL = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
    static final String USER = "root";
    static final String PASS = "123456";

    public static void main(String[] args) {
        // 1. 建立連線 (try-with-resources 自動關閉)
        try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) {
            
            // 2. 新增 (PreparedStatement 防 SQL 注入)
            String insertSql = "INSERT INTO users(name, email) VALUES(?, ?)";
            try (PreparedStatement ps = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) {
                ps.setString(1, "Alice");
                ps.setString(2, "alice@example.com");
                int rows = ps.executeUpdate();
                System.out.println("新增筆數:" + rows);
                
                // 取得自增主鍵
                try (ResultSet keys = ps.getGeneratedKeys()) {
                    if (keys.next()) System.out.println("生成 ID:" + keys.getLong(1));
                }
            }

            // 3. 查詢
            String querySql = "SELECT id, name, email FROM users WHERE id > ?";
            try (PreparedStatement ps = conn.prepareStatement(querySql)) {
                ps.setInt(1, 0);
                try (ResultSet rs = ps.executeQuery()) {
                    while (rs.next()) {
                        System.out.printf("ID:%d Name:%s Email:%s%n",
                                rs.getLong("id"), rs.getString("name"), rs.getString("email"));
                    }
                }
            }

            // 4. 交易控制:轉帳範例
            conn.setAutoCommit(false); // 開啟交易
            try {
                updateBalance(conn, 1, -100); // 扣款
                updateBalance(conn, 2, 100);  // 入帳
                conn.commit(); // 提交
                System.out.println("轉帳成功");
            } catch (Exception e) {
                conn.rollback(); // 回滾
                System.out.println("轉帳失敗,已回滾:" + e.getMessage());
            } finally {
                conn.setAutoCommit(true); // 恢復預設
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    static void updateBalance(Connection conn, long userId, int amount) throws SQLException {
        String sql = "UPDATE users SET balance = balance + ? WHERE id = ?";
        try (PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setInt(1, amount);
            ps.setLong(2, userId);
            ps.executeUpdate();
        }
    }
}

生產環境必備:連線池

頻繁建立/關閉連線極其低效。推薦 HikariCP (Spring Boot 預設):

// Maven: com.zaxxer:HikariCP:5.0.1
HikariConfig config = new HikariConfig();
config.setJdbcUrl(URL);
config.setUsername(USER);
config.setPassword(PASS);
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);

DataSource ds = new HikariDataSource(config);
// 使用時:try (Connection conn = ds.getConnection()) { ... }

最佳實踐清單

  • ✅ 永遠使用 PreparedStatement 防止 SQL 注入
  • ✅ 盡早關閉 ResultSet、Statement、Connection (try-with-resources)
  • ✅ 批次處理大量寫入:ps.addBatch() + ps.executeBatch()
  • ✅ 設定 fetchSize 優化大量查詢:stmt.setFetchSize(1000)
  • ✅ 使用連線池管理連線生命週期

掌握以上核心,即可在 Java 專案中穩健高效地操作關聯式資料庫。

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