首页  >  文章  >  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