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

你确定你不能只用一个语句来实现同样的事情:

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

于 2012-07-06T19:25:41.000 回答
0

您可以使用多个 PreparedStatement 来获得所需的结果:

// 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) 提交事务。

我的建议并不完全遵循这个顺序。我建议您有一个大的 PL/SQL 匿名块,其中包含 A 和 B 的语句。您将在执行之前填写整个块的所有绑定变量。您可以从 PL/SQL 块中控制是否提交/回滚或您想要的任何其他逻辑(包括更复杂的异常处理)。

这基本上就像拥有一个不存储在数据库中的存储过程。老实说,对于不需要在某个代码的上下文之外可用的东西,这是我的首选方法。所以你的业务逻辑没有保存在数据库中(很多人会争论几个小时来争论这是好事还是坏事;我个人讨厌数据库级别的业务逻辑,但这取决于你的项目)。

此外,请查看 PreparedStatement 继承自 Statement 的文档。

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

如果你真的想用同一个 PreparedStatement 对象来执行一个 SQL 语句,你可以调用 clearBatch 和 addBatch,然后换出 SQL 并执行一个完全不同的语句。

于 2012-07-06T17:30:34.423 回答