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

Java PreparedStatement 參數綁定通用工具方法

     編輯:Java 相關知識

簡化 JDBC 參數設定:List 批次綁定至 PreparedStatement

使用 `PreparedStatement` 時,手動呼叫 `setString(1, ...)`、`setInt(2, ...)` 既繁瑣又易出錯。本工具方法接受 `List` 自動根據型別派發對應的 `setXxx` 方法,減少樣板碼。

工具方法

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

public class JdbcParamUtil {

    /** 將 List 參數依序綁定至 PreparedStatement (索引從 1 開始) */
    public static void bindParams(PreparedStatement ps, List<?> params) throws SQLException {
        if (params == null) return;
        for (int i = 0; i < params.size(); i++) {
            Object val = params.get(i);
            int idx = i + 1; // JDBC 參數索引從 1 開始
            if (val == null) {
                ps.setObject(idx, null);
            } else if (val instanceof String) {
                ps.setString(idx, (String) val);
            } else if (val instanceof Integer) {
                ps.setInt(idx, (Integer) val);
            } else if (val instanceof Long) {
                ps.setLong(idx, (Long) val);
            } else if (val instanceof Double) {
                ps.setDouble(idx, (Double) val);
            } else if (val instanceof Boolean) {
                ps.setBoolean(idx, (Boolean) val);
            } else if (val instanceof java.util.Date) {
                ps.setTimestamp(idx, new java.sql.Timestamp(((java.util.Date) val).getTime()));
            } else if (val instanceof java.sql.Date) {
                ps.setDate(idx, (java.sql.Date) val);
            } else {
                // 兜底:交給 JDBC 驅動處理
                ps.setObject(idx, val);
            }
        }
    }
}

使用範例

String sql = "INSERT INTO users(username, age, email, created_at) VALUES (?, ?, ?, ?)";
try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql)) {

    List<Object> params = Arrays.asList("Alice", 25, "alice@example.com", new Date());
    JdbcParamUtil.bindParams(ps, params);
    ps.executeUpdate();
}

擴充建議

  • 支援更多型別:`BigDecimal`、`Byte[]`、`Blob`/`Clob`、`LocalDateTime` (JDBC 4.2+)。
  • 命名參數:結合 Jdbi 或 Spring NamedParameterJdbcTemplate 使用 `:name` 佔位符,更易讀。
  • 批次處理:同一 SQL 重複執行時,使用 `ps.addBatch()` + `ps.executeBatch()` 大幅提升效能。

注意事項

  1. 參數順序必須與 SQL 中 `?` 順序一致。
  2. `setObject` 為萬用方法,但明確呼叫 `setString`/`setInt` 等可讓驅動更早發現型別不匹配。
  3. 大量資料匯入建議使用資料庫原生工具(`LOAD DATA`、`COPY`)或批次 API。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved