首页  >  文章  >  Java  >  如何在 Java JDBC 中参数化 IN 子句?

如何在 Java JDBC 中参数化 IN 子句?

Barbara Streisand
Barbara Streisand原创
2024-11-01 03:15:02518浏览

How to Parameterize an IN Clause in Java JDBC?

IN 子句中的 JDBC 参数化

在 Java JDBC 中,与其他编程相比,对 IN 子句中的参数进行参数化需要更多的独创性

当我们需要执行如下查询时就会出现问题:

SELECT * FROM MYTABLE WHERE MYCOL IN (?)

挑战

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>

限制

请注意,某些数据库(如 Oracle)可能会对 IN 子句中允许的值数量施加限制。

以上是如何在 Java JDBC 中参数化 IN 子句?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn