1

Javaで何かが可能かどうか疑問に思っています

String A = "UPDATE blah set x=? y=? z=?"
String B = "UPDATE blah set a=? b=? c=? d=?"

主に速度のために、次にセキュリティのために、準備されたステートメントを用意したいと思います。A のバインド変数に入力し、A を実行し、B のバインド変数を実行し、B を実行してから、トランザクション全体をコミットできるようにしたいと考えています。これを達成するためのより良い方法はありますか?

4

3 に答える 3

1

たった1つのステートメントで同じことを達成できないと確信していますか?

UPDATE blah set x=?, y=?, z=?, a=?, b=?, c=?, d=?

于 2012-07-06T19:25:41.000 に答える
0

目的の結果を得るために、複数の PreparedStatements を利用できます。

// Prepare code for PreparedStatement #1
String varOne = "A";
String varTwo = "B";
String varThree = "C";

String queryOne = "UPDATE blah set x=? y=? z=?"
PreparedStatement firstStmt = conn.prepareStatement(queryOne);

firstStmt.setString(1, varOne);
firstStmt.setString(2, varTwo);
firstStmt.setString(3, varThree);

firstStmt.executeUpdate();
conn.commit();

// Prepare code for PreparedStatement #2
String varOneB = "X";
String varTwoB = "Y";
String varThreeB = "Z";
String varFourB = "A";

String queryOne = "UPDATE blah set a=? b=? c=? d=?"
PreparedStatement secondStmt = conn.prepareStatement(queryTwo);

secondStmt.setString(1, varOneB);
secondStmt.setString(2, varTwoB);
secondStmt.setString(3, varThreeB);

secondStmt.executeUpdate();
conn.commit();
于 2012-07-06T17:10:42.437 に答える
0

同じトランザクションで両方の更新ステートメントを実行する無名 PL/SQL ブロックを含む文字列を作成し、その文字列を PreparedStatement で使用してバインド変数を設定できます。

1) A のバインド変数を入力し、2) A を実行し、3) B のバインド変数を入力し、4) B を実行し、5) トランザクションをコミットしたいとおっしゃいました。

私の提案は、その順序に正確に従っていません。A と B のステートメントを含む 1 つの大きな PL/SQL 匿名ブロックを用意することをお勧めします。実行する前に、ブロック全体のすべてのバインド変数を入力します。PL/SQLブロック内から、コミット/ロールバックまたは必要なその他のロジック(より複雑な例外処理を含む)を制御できます。

これは基本的に、データベースに保存しないストアド プロシージャを使用するようなものです。正直なところ、コードの一部のコンテキスト外で利用可能にする必要のないものに対しては、これが私の好みの方法です。そのため、ビジネス ロジックはデータベースに保持されません (多くの人が、それが良いことか悪いことかについて何時間も議論します。私は個人的にデータベース レベルでのビジネス ロジックは嫌いですが、それはプロジェクトによって異なります)。

また、PreparedStatement が継承する Statement のドキュメントも参照してください。

http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html

本当に同じ PreparedStatement オブジェクトを使用して 1 つの SQL ステートメントを実行したい場合は、clearBatch と addBatch を呼び出してから、SQL を入れ替えて、まったく別のステートメントを実行できます。

于 2012-07-06T17:30:34.423 に答える