我想知道Java中是否有可能
String A = "UPDATE blah set x=? y=? z=?"
String B = "UPDATE blah set a=? b=? c=? d=?"
我想准备一份主要针对速度的声明,其次是安全性。我希望能够为A填写绑定变量,执行A,为B绑定变量,然后执行B,然后提交整个事务。有没有更好的方法来实现这一目标?
答案 0 :(得分: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();
答案 1 :(得分:0)
您可以创建一个字符串,该字符串具有在同一事务中运行两个update语句的匿名PL / SQL块,并使用该字符串和PreparedStatement来设置绑定变量。
我知道你说你要1)填写A的绑定变量,2)执行A,3)填写B的绑定变量,4)执行B,5)提交事务。
我的建议并不完全遵循该命令。我建议您有一个包含A和B语句的大型PL / SQL匿名块。在执行之前,您将为整个块填写所有绑定变量。您可以在PL / SQL块中控制是否提交/回滚或任何其他逻辑(包括更复杂的异常处理)。
这基本上就像拥有一个不存储在数据库中的存储过程。老实说,我喜欢的方法不需要在一些代码的上下文之外可用。因此,您的业务逻辑不会保留在数据库中(许多人会争辩说这是好事还是坏事;我个人讨厌数据库级别的业务逻辑,但这取决于您的项目。)
另外,请查看Statement的文档,PreparedStatement继承自。
http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html
如果你真的想使用相同的PreparedStatement对象来执行一个SQL语句,那么你可以调用clearBatch和addBatch,然后换掉SQL并执行一个完全不同的语句。
答案 2 :(得分:0)
你确定只用一个陈述就不能达到同样的效果:
UPDATE blah set x =?,y =?,z = ?, a =?,b =?,c =?,d =?