现在我一直在寻找这个,我得到了同样的答案。我想要的是在java中使用jdbc在一个变量下批处理不同的语句。到目前为止,我得到的是具有相同模式的批处理语句,例如,INSERT INTO表VALUES('?','?')。这可以使用准备好的声明来完成。但我尝试使用java.sql.Statement批处理不同类型的语句,并且它们执行得很好。例如,在一个语句下进行更新和插入,提交一次。但是现在java.sql.Statement的问题在于它现在可以执行prepareStatement所做的事情,人们称之为转义。同样,prepareStatement的问题是它只批处理相同模式的语句,因为你无法更新和插入。它必须是两者中的一个。
所以现在我想我会使用java.sql.Statement,但是有一个库可以执行prepareStatement所做的事情,String转义以避免Sql注入。另外,如果我错误地使用我可能不知道的另一个术语进行批处理,而是纠正我并告诉我我想要做的是调用,即在一个java.sql.Statement下执行多个不同的语句。
最后一件事,当批处理时我意识到没有语法验证,我不想要,在执行期间检查所有错误,这也可能属于可以验证Sql的库。
答案 0 :(得分:1)
无论你提到的是正确的。
您可以批处理类似的语句,并且可以立即执行。但据我所知,java中没有库可以将不同类型的语句组合或批处理并执行。
我想说的最后一件事是,当你使用PreparedStatement对象时,如果sql语句中的任何错误被抛出,sql语句将只被编译一次,否则语句将被执行。如果使用不同的值再次向数据库发送相同的语句,则不会编译该语句并仅由数据库服务器执行。
答案 1 :(得分:0)
既然你正在寻找一个库来做这种事情,是的,jOOQ 可以通过它的 BatchedConnection
为你做,而且你甚至不必使用 jOOQ 的 DSL 来访问这个功能,虽然它也适用于 DSL。以下代码片段说明了这是如何工作的。
假设你有这样的逻辑:
// This is your original JDBC connection
try (Connection connection = ds.getConnection()) {
doSomethingWith(connection);
}
// And then:
void doSomethingWith(Connection c) {
try (PreparedStatement s = c.prepareStatement("INSERT INTO t (a, b) VALUES (?, ?)")) {
s.setInt(1, 1);
s.setInt(1, 2);
s.executeUpdate();
}
try (PreparedStatement s = c.prepareStatement("INSERT INTO t (a, b) VALUES (?, ?)")) {
s.setInt(1, 3);
s.setInt(1, 4);
s.executeUpdate();
}
try (PreparedStatement s = c.prepareStatement("INSERT INTO u (x) VALUES (?)")) {
s.setInt(1, 1);
s.executeUpdate();
}
try (PreparedStatement s = c.prepareStatement("INSERT INTO u (x) VALUES (?)")) {
s.setInt(1, 2);
s.executeUpdate();
}
}
现在,您无需重新编写代码,只需使用 jOOQ 胶水代码将其包装起来即可:
// This is your original JDBC connection
try (Connection connection = ds.getConnection()) {
// Now wrap that with jOOQ and turn it into a "BatchedConnection":
DSL.using(connection).batched(c -> {
// Retrieve the augmented connection again from jOOQ and run your original logic:
c.dsl().connection(connection2 -> {
doSomethingWith(connection2);
});
});
}
现在,无论您的方法 doSomethingWith()
对 JDBC 连接做什么,它现在都尽可能地批处理,即前两个插入一起批处理,第三个和第四个也是如此。