1

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

所以现在我想我会使用java.sql.Statement,但是有没有一个库可以做preparedStatement的工作,字符串转义以避免Sql注入。另外,如果我将批处理误认为是我可能不知道的另一种术语,请纠正我并告诉我我想要做的事情是调用,即在一个 java.sql.Statement 下执行多个不同的语句。

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

4

2 回答 2

1

你说的都是对的。

您可以批处理类似的语句集,并且可以立即执行。但据我所知,java 中没有库可以将不同类型的语句组合或批处理在一起并被执行。

最后我想说的是,当你使用 PreparedStatement 对象时,sql 语句只会编译一次,如果 sql 语句中有任何错误,将被抛出,否则语句将被执行。如果相同的语句以不同的值再次发送到数据库,则该语句将不会被数据库服务器编译并简单地执行。

于 2013-10-03T04:29:03.893 回答
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 连接做什么,它现在都尽可能好地进行批处理,即前两个插入被批处理在一起,第三个和第四个插入也是如此。

于 2021-04-22T09:12:15.053 回答