ホームページ >データベース >mysql チュートリアル >JDBC で IN 句を効率的にパラメータ化するにはどうすればよいですか?

JDBC で IN 句を効率的にパラメータ化するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-15 10:51:44218ブラウズ

How to Efficiently Parameterize IN Clauses in JDBC?

JDBC での

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 find(Set ids) throws SQLException { List エンティティ = new ArrayList<>(); String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size()));

<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>

以上がJDBC で IN 句を効率的にパラメータ化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。