web-dev-qa-db-ja.com

JDBC準備済みステートメントでパラメーターインデックスの代わりに変数を使用する

多くのプログラミング言語では、準備されたステートメントに対して次のようなことが可能です。

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}");
statement.setString("name", "IBM");

ただし、Java.sql.PreparedStatementでは使用できません。 Javaでは、パラメータインデックスを使用する必要があります。

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?");
statement.setString(1, "IBM");

最初の例のように文字列変数を処理する解決策はありますか? 「$ {。*}」はSQL言語の他の場所で使用されていませんか、それとも競合がありますか?原因は自分で実装することです(SQL文字列を解析し、すべての変数を "?"に置き換えてからJava方法)を実行します)。

よろしく、カイ

34
Zardoz

Kd304が私の投稿へのコメントで述べたように、プロジェクトに別のサードパーティライブラリ(Springなど)を組み込みたくない場合、これは非常に良い解決策です。 Javaworld記事:PreparedStatementの名前付きパラメーター

17
Zardoz

標準JDBC PreparedStatementsにはこの機能はありません。 Spring JDBCは NamedParameterJdbcTemplate を通じてこの機能を提供します。

26
laz

あなたが言うように、生のPreparedStatementを使用すると、これは不可能です。 CallableStatementでも可能ですが、SQLステートメントだけでなく、ストアドプロシージャが必要です。

HibernateのようなORMレイヤーは名前付きパラメーターの置換も提供し、HibernateはORマッピング機能を完全にバイパスしてネイティブSQLを実行することもできます。

したがって、名前付きパラメーターを使用したい場合は、これを行う方法としてHibernateを使用できます。その機能のごく一部しか使用しません。

5
skaffman