我正在尝试批量更新,然后获取受影响的行总数。对于 Oracle,我通过使用 getUpdateCount 获得正确的输出,但此 API 对于 PostgreSQL、SQL Server 和 H2 失败。对于这些数据库,我需要迭代并添加executeBatch 输出。
PreparedStatement preparedStatement = connection.prepareStatement(getSQL());
//created queries via addBatch()
int[] ints = preparedStatement.executeBatch();
connection.commit();
int updateCount = preparedStatement.getUpdateCount();
Assert.assertEquals(updateCount,3);
Assert.assertNotNull(ints);
我很好奇为什么这个 API 没有给出正确的输出?我的驱动程序如下。
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.2.0.jre8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.jtds</groupId>
<artifactId>jtds</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
<scope>test</scope>
</dependency>
在
executeBatch
的情况下,您根本不应该检查 getUpdateCount()
,您应该仅查看返回的数组。 getUpdateCount()
的行为仅与
execute()
和
getMoreResults()
组合指定。对于任何其他执行方法,它的行为是 JDBC未指定的,因此如果您没有调用
execute()
或
getMoreResults()
(您可以通过规范仅在使用后致电
execute()
)。也就是说,使用
executeQuery()
和
executeUpdate()
进行单一执行时,大多数驱动程序通常会非常一致,就好像使用了
execute()
一样,但是对于
executeBatch()
,它将很大程度上取决于批处理执行的实现方式以及更新方式计数已检索。