IN 句のパラメータ化: ダイレクト メソッドはありますか?
JDBC では、IN 句を効率的にパラメータ化するのが難しい場合があります。一般的なクエリ構造は次のとおりです:
<code class="language-sql">SELECT * FROM MYTABLE WHERE MYCOL in (?)</code>
このような句に値を動的に挿入するには、SQL を変更せずにさまざまなデータベース間で機能する簡単な方法が必要です。
残念ながら、JDBC はこの問題に対するネイティブな解決策を提供していません。ただし、一部のドライバーは IN 句の PreparedStatement#setArray() をサポートする場合があります。
代替方法
あるいは、ヘルパー メソッドを使用してプレースホルダーを作成し、パラメーター値を繰り返し設定することもできます。実装は次のとおりです:
<code class="language-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>
使用例:
```ジャバ private static Final String SQL_FIND = "SELECT ID、名前、値 FROM エンティティ WHERE id IN (%s)";public List } 以上がJDBC で IN 句を効率的にパラメータ化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。<code>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>
<code>
<p><strong>注意事项</strong></p>
- 请注意,某些数据库限制了IN子句中允许的值的数量。
- 此方法利用PreparedStatement接口,确保跨数据库兼容性。
- 还必须考虑数据库特定的优化,例如使用数组或批量更新。</code>