首頁  >  文章  >  Java  >  如何有效地參數化 JDBC 中的 IN 子句?

如何有效地參數化 JDBC 中的 IN 子句?

Barbara Streisand
Barbara Streisand原創
2024-11-01 01:02:28232瀏覽

How Can I Parameterize IN Clauses in JDBC Effectively?

在JDBC 中參數化IN 子句:一種綜合方法

在處理資料庫查詢時,參數化輸入值對於安全性和性能都至關重要。 IN 子句通常用於指定多個值作為查詢的一部分,而 JDBC 提供了參數化這些值的機制以防止 SQL 注入攻擊。

但是,沒有直接在 JDBC 中參數化 IN 子句的方法。某些 JDBC 驅動程式可能支援PreparedStatement#setArray() 用於此目的,但其跨資料庫的可用性各不相同。

對於通用且與資料庫無關的方法,您可以使用輔助方法來動態產生佔位符和設定值:

<code class="java">public static String preparePlaceHolders(int length) {
    return String.join(",", Collections.nCopies(length, "?"));
}

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}

以下是應用這些方法的方法:

<code class="java">private static final String SQL_FIND = "SELECT id, name, value FROM entity WHERE id IN (%s)";

public List<Entity> find(Set<Long> ids) throws SQLException {
    List<Entity> entities = new ArrayList<>();
    String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size()));

    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(sql);
    ) {
        setValues(statement, ids.toArray());

        try (ResultSet resultSet = statement.executeQuery()) {
            while (resultSet.next()) {
                entities.add(map(resultSet));
            }
        }
    }

    return entities;
}</code>

請注意,某些資料庫可能會限制IN 子句中允許的值的數量。例如,Oracle 有 1000 個項目的限制。在設計查詢並可能將大列表分解為較小的區塊時,必須考慮這一點。

以上是如何有效地參數化 JDBC 中的 IN 子句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn