jdbc批处理不同的语句

时间:2013-10-02 17:14:50

标签: mysql jdbc

现在我一直在寻找这个,我得到了同样的答案。我想要的是在java中使用jdbc在一个变量下批处理不同的语句。到目前为止,我得到的是具有相同模式的批处理语句,例如,INSERT INTO表VALUES('?','?')。这可以使用准备好的声明来完成。但我尝试使用java.sql.Statement批处理不同类型的语句,并且它们执行得很好。例如,在一个语句下进行更新和插入,提交一次。但是现在java.sql.Statement的问题在于它现在可以执行prepareStatement所做的事情,人们称之为转义。同样,prepareStatement的问题是它只批处理相同模式的语句,因为你无法更新和插入。它必须是两者中的一个。

所以现在我想我会使用java.sql.Statement,但是有一个库可以执行prepareStatement所做的事情,String转义以避免Sql注入。另外,如果我错误地使用我可能不知道的另一个术语进行批处理,而是纠正我并告诉我我想要做的是调用,即在一个java.sql.Statement下执行多个不同的语句。

最后一件事,当批处理时我意识到没有语法验证,我不想要,在执行期间检查所有错误,这也可能属于可以验证Sql的库。

2 个答案:

答案 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 连接做什么,它现在都尽可能地批处理,即前两个插入一起批处理,第三个和第四个也是如此。

>