我想知道Java中是否有可能
String A = "UPDATE blah set x=? y=? z=?"
String B = "UPDATE blah set a=? b=? c=? d=?"
我想有一个准备好的声明,主要是为了速度,其次是为了安全。我希望能够为 A 填写绑定变量,执行 A,为 B 绑定变量,然后执行 B,然后提交整个事务。有没有更好的方法来实现这一点?
你确定你不能只用一个语句来实现同样的事情:
UPDATE blah set x=?, y=?, z=?, a=?, b=?, c=?, d=?
您可以使用多个 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();
您可以创建一个具有匿名 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 并执行一个完全不同的语句。