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

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

Linda Hamilton
リリース: 2025-01-15 08:02:44
オリジナル
601 人が閲覧しました

JDBC パラメータ化された IN 句の効率的な使用

SQL クエリでは、指定されたコレクションと値を照合するために IN 句が使用されます。 Java と JDBC を使用する場合、IN 句でパラメータをパラメータ化することは、セキュリティとパフォーマンスにとって重要です。

直接パラメータ化する方法は存在しますか?

残念ながら、JDBC には IN 句の値を直接パラメータ化する方法がありません。ただし、一部の JDBC ドライバーは PreparedStatement#setArray() をサポートする場合があります。

包括的なソリューション

この問題を解決するには、ヘルパー メソッドを作成してプレースホルダーを生成し、ループ内で値を設定します。仕組みは次のとおりです:

  1. preparePlaceHolders(length): Collections#nCopies() と String#join() を使用して、カンマ区切りのプレースホルダー文字列を生成します。たとえば、3 つの値を含む IN 句の場合、次に for" ?、?、?」。
  2. setValues(preparedStatement,values): PreparedStatement#setObject() を使用して、values 配列の各値を準備されたステートメントに設定し、パラメータを IN 句に効果的に割り当てます。

使用例:

<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 項目に制限しています。

How Can I Parameterize an IN Clause Effectively with JDBC?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート