在为MySQL进行批处理时,JDBC似乎不想调用DELETE PreparedStatement

时间:2017-08-27 21:51:02

标签: java mysql sql jdbc

当我以非批处理模式运行代码时,它可以工作:

PreparedStatement preparedStatement = connection.prepareStatement(
        "DELETE FROM myTable WHERE id=58");
preparedStatement.execute();

但是,一旦我尝试以批处理模式运行它:

PreparedStatement preparedStatement = connection.prepareStatement(
       "DELETE FROM myTable WHERE id=58");
preparedStatement.executeBatch();

它将不再删除表中的条目。我INSERTS的所有内容都与executeBatch完美配合,实际上除了DELETE命令之外的所有内容都是如此。它没有任何类型的错误,它似乎忽略了命令并跳过它。如果我通过查看int []来检查受影响的列数,则返回它的空(int [] .length = 0)。

更新:我不相信这是一个权限问题,因为用户帐户具有完全root权限并可以访问所有命令。如果这是一个许可问题,那么它不应该以非批处理模式工作。

1 个答案:

答案 0 :(得分:1)

问题在于,对于删除SQL语句,无论出于何种原因我忘记添加以下行:

preparedStatement.addBatch();

省略此行意味着PreparedStatement从未添加到批处理中,因此从未执行过。当然没有警告或错误,因为SQL语句永远不会执行,它只是省略了。由于批处理中存在其他SQL批处理PreparedStatement,因此不需要抛出空批处理异常(某些驱动程序将抛出异​​常,但这不能保证,因此不要依赖它)。

因此正确的代码是:

PreparedStatement preparedStatement = connection.prepareStatement(
       "DELETE FROM myTable WHERE id=58");
preparedStatement.addBatch();
preparedStatement.executeBatch();

现在正如评论中所指出的,您通常不希望使用批处理执行单个SQL命令,这样做的原因是将问题隔离到特定的SQL命令。