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