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