PreparedStatement使用不同的SQL语句进行批处理

时间:2012-07-06 16:58:30

标签: java sql oracle

我想知道Java中是否有可能

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

我想准备一份主要针对速度的声明,其次是安全性。我希望能够为A填写绑定变量,执行A,为B绑定变量,然后执行B,然后提交整个事务。有没有更好的方法来实现这一目标?

3 个答案:

答案 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 =?