3

我对 Java 中的 Prepared Statement 有疑问,因为我对此不太了解。

我有一个必须使用 PreparedStatement 的用例。但我只是在编写代码之前想:

while(...)
{
   if(...)
   {
     preparedStatement.setString(1, fname);
     preparedStatement.setString(2, lname); 
      ...
     preparedStatement.addBatch();
   }
}
preparedStatement.executeBatch();

让我们考虑上面的代码。有一个 while 循环会做一些事情,然后检查一些条件,然后在准备好的语句中添加批处理。

1)所以,我的问题是,假设没有批次添加到准备好的语句中,我仍然说executeBatch。它会给我例外还是会执行得很好?

2)有什么方法可以在执行前检查preparedstatement中的批处理吗?

谢谢。

4

3 回答 3

2

它应该可以正常工作并返回一个空数组。要知道当前是否添加了批次,AFAIK 的唯一方法是自己跟踪它们。

另一方面,如果您只想知道实际执行了多少条语句,那么您可以使用返回的更新计数数组来检查运行了多少查询,以及其中的各个值来查看它们中的每一个是否它们成功了。executeBatch()有关详细信息,请参阅文档。

于 2013-03-05T10:29:58.927 回答
2

您不必担心处理这种情况。一旦你熟悉了编写 API,你应该期望 javadoc 会给你一个 throws 子句的标准:

抛出:SQLException - 如果发生数据库访问错误,则在关闭的语句上调用此方法或驱动程序不支持批处理语句。如果发送到数据库的命令之一未能正确执行或尝试返回结果集,则引发 BatchUpdateException(SQLException 的子类)。SQLTimeoutException - 当驱动程序确定已超过 setQueryTimeout 方法指定的超时值时并且至少尝试取消当前正在运行的语句

此外,如果您持怀疑态度,请考虑返回类型、int[] java.sql.Statement.executeBatch() API 中的 Expect 对象为 null,以及返回空值或初始化值的标准原语/基本类型

正如 WDS 所说,它应该返回一个空的 int 数组。

于 2017-01-17T20:04:49.973 回答
2
if(preparedstatement.executeBatch().length == 0){
//do somethimg
}

基本上测试批次是否没有语句;-)

于 2017-06-28T14:47:28.120 回答