SQL クエリでは、指定されたコレクションと値を照合するために IN 句が使用されます。 Java と JDBC を使用する場合、IN 句でパラメータをパラメータ化することは、セキュリティとパフォーマンスにとって重要です。
直接パラメータ化する方法は存在しますか?
残念ながら、JDBC には IN 句の値を直接パラメータ化する方法がありません。ただし、一部の JDBC ドライバーは PreparedStatement#setArray() をサポートする場合があります。
包括的なソリューション
この問題を解決するには、ヘルパー メソッドを作成してプレースホルダーを生成し、ループ内で値を設定します。仕組みは次のとおりです:
使用例:
<code class="language-java">import java.util.*; import java.sql.*; 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()); // 执行查询... } return entities; }</code>
注: 一部のデータベースでは、IN 句で許可される値の数に制限があります。たとえば、Oracle ではこれを 1000 項目に制限しています。
以上がJDBC で IN 句を効果的にパラメータ化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。