Java 不同SQL语句的PreparedStatement批处理

Java 不同SQL语句的PreparedStatement批处理,java,sql,oracle,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,然后提交整个事务。有没有更好的方法来实现这一点?您可以利用多个PreparedStatement来获得所需的结果: // Prepare code for Prepare

我想知道在Java中是否有一些东西是可能的

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

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

您可以利用多个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();

您可以创建一个字符串,该字符串具有在同一事务中运行两个update语句的匿名PL/SQL块,并将该字符串与PreparedStatement一起使用以设置绑定变量

我知道你说过你想1)为A填写绑定变量,2)执行A,3)为B填写绑定变量,4)执行B,5)提交事务

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

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

另外,请查看PreparedStatement继承自的语句的文档


如果确实要使用同一个PreparedStatement对象来执行一条SQL语句,则可以调用clearBatch和addBatch,然后交换SQL并执行一条完全不同的语句。

您确定不能仅使用一条语句实现相同的目标吗:


是否更新blah set x=?,y=?,z=?,a=?,b=?,c=?,d=?

可能不是服务器上的存储过程?不是真的。请注意,准备好的语句只有在使用不同的绑定参数多次执行时才真正显示出性能优势(假设它们构造正确,它们始终是一种增益安全策略)。如果这是一个web应用程序,我可能会建议在bean实例化期间执行
PREPARE
——不要在每次服务调用时都这样做。除了我在下面的回答中的建议(使用匿名PL/SQL块或使用clearBatch和addBatch方法),我想知道为什么不使用多个已准备好的语句?这是什么样的应用程序?如果你在考虑性能,你会考虑语句合并吗?在这个链接中有一些关于语句池的信息,大约在页面的一半处。。。preparedStatement批处理总是使用同一个“prepared”语句。您的问题得到了回答吗?有什么可以进一步澄清的吗?我一直在用一个sql字符串来做这件事,但我特别想知道如何使用两个不同的sql查询和绑定变量/batching我构建了一个自定义ETL,允许变量绑定和多个查询。另见:。您需要准备并执行查询A的代码,然后重复查询B的代码;bind变量并不是唯一改变的东西,实际语句也在改变。