在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,