「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JDBC で IN 句を効果的にパラメータ化するにはどうすればよいですか?

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

2024 年 11 月 2 日に公開
ブラウズ:423

How can I parameterize an IN clause in JDBC effectively?

JDBC IN 句のパラメータ化: 効率的なアプローチ

SELECT * FROM MYTABLE WHERE MYCOL in ( などの IN 句クエリを処理する場合?)、引数をパラメータ化することで、セキュリティと効率が確保されます。 JDBC は直接的な解決策を提供しませんが、特定のドライバーは PreparedStatement#setArray().

パラメータ化のヘルパー メソッド

をサポートする場合があります。直接サポートがない場合は、ヘルパー メソッドを活用して、IN 句のプレースホルダーを生成し、値を動的に設定できます。

  • preparePlaceHolders(int length): 指定された長さのプレースホルダーのカンマ区切りリストを生成します。
  • setValues(PreparedStatement prepareStatement, Object...values): PreparedStatement#setObject() を使用してループ内に値を設定します。

実装例

次のデータ アクセス方法を考えてみましょう。

private static final String SQL_FIND = "SELECT id, name, value FROM entity WHERE id IN (%s)";

public List find(Set ids) throws SQLException {
    List 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;
}

重要な考慮事項

  • データベースによって、IN 句で許可される値の数が制限される場合があります。
  • このアプローチにより、異なるデータベース間での移植性が保証されます。 SQL ステートメントの生成を値の設定から分離することによって。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3