在executeBatch()之前如何检查Prepared Statement是不是有一些批次?

Posted

技术标签:

【中文标题】在executeBatch()之前如何检查Prepared Statement是不是有一些批次?【英文标题】:How to check whether Prepared Statement has some batches or not, before executeBatch()?在executeBatch()之前如何检查Prepared Statement是否有一些批次? 【发布时间】:2013-03-05 10:15:21 【问题描述】:

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

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

while(...)

   if(...)
   
     preparedStatement.setString(1, fname);
     preparedStatement.setString(2, lname); 
      ...
     preparedStatement.addBatch();
   

preparedStatement.executeBatch();

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

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

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

谢谢。

【问题讨论】:

尝试执行它,看看它说了什么! 【参考方案1】:

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

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

【讨论】:

你是对的@wds,我们应该跟踪它,但我认为应该有像 count 或 hasBatches 这样的方法,通过它我们可以知道它有多少个语句拥有。感谢您的答复。 :)【参考方案2】:

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

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

此外,如果您持怀疑态度,请考虑返回类型,int[] java.sql.Statement.executeBatch() 期望对象在 API 中为空,并且标准原语/基类型返回空值或初始化值

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

【讨论】:

【参考方案3】:
if(preparedstatement.executeBatch().length == 0)
//do somethimg

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

【讨论】:

虽然这可能会回答问题,但仅代码的答案是不受欢迎的。还请向 OP 提供解释以解释您的答案。 How to Answer

以上是关于在executeBatch()之前如何检查Prepared Statement是不是有一些批次?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 ArrayIndexOutOfBoundsException 的情况下通过 executeBatch 获取生成的密钥?

JDBC批量插入数据优化,使用addBatch和executeBatch

JDBC批量插入数据优化,使用addBatch和executeBatch

ANSYS中,我在命令行输入、CLEAR,出现、CLEAR is not a recognized PREP7 command,abbreviantion,

Java sql如何进行executeBatch()插入以返回布尔值

JDBC_批量处理SQL语句