5

ArrayList(またはそれに関しては任意の種類のリスト)をPreparedStatementにバインドする方法があるかどうか疑問に思いました。これは、最終的にOracleデータベースへのアクセスに使用されます。私が見つけた:

PreparedStatement IN句の代替?

これは私の問題に似ているように見えますが、この質問はより具体的です。Oracleで使用するPreparedStatementにArrayListをバインドしたいのですが、可能であれば、これはどのように達成されますか?

4

3 に答える 3

5

List を準備済みステートメントの単一のパラメーターにバインドすることはできません。

リスト内の各要素のパラメーター マーカーを使用して SQL を生成します。次に例を示します。

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)

クエリごとに新しいステートメントを生成しますが、PreparedStatement. リストにStringインスタンスが含まれている場合、SQL インジェクションから保護するために必要なエスケープが行われます。

ただし、オブジェクトのように安全な型であってもInteger、一部のドライバーまたはミドルウェアは をキャッシュPreparedStatementsして、同じフォームが要求された場合にキャッシュされたインスタンスを返すことができます。もちろん、いくつかのテストは必要です。リストのサイズが大きく異なる場合、多くの異なるステートメントが存在することになり、実装が不十分なキャッシュでは、多くのステートメントを処理する準備ができていない可能性があります。

于 2008-11-19T20:39:28.120 に答える
3

直接バインドすることはできません。配列をパラメータとして渡す方法があります。データベース側で何をしたいのかわからないので、これは役に立たないかもしれません。

基本的に、データベースにネストされたテーブル タイプを作成する必要があります。配列からのデータを含む、その型に基づいた Java オブジェクトを構築します。それをパラメータとして渡します。

これらのオブジェクトをデータベースに作成した場合:

CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20);
CREATE TABLE my_table (a  my_nested_table) NESTED TABLE a STORE AS my_table_a;

次に、次のような Java コードを記述できます。

String[] insertvalues = { "a", "b", "c" };
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES( ? )");
ARRAY insertParameter = new ARRAY( a_desc, conn, insertvalues );
p.setArray( 1, insertParameter );
p.execute();

Oracle での結果は次のようになります。

dev> select * from my_table;

A
--------------------------------------------------------------------------------
MY_NESTED_TABLE('a', 'b', 'c')
于 2008-11-19T20:53:06.687 に答える
0

ええと、その答え、特にその質問の私の間違った答えへのコメントから判断すると、できません。

https://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html#996857を参照してください。

于 2008-11-19T20:38:47.027 に答える