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中文网其他相关文章!