2016-02-08 37 views
-1

我正在使用jdbc在java中对1000条记录进行批量更新。其中800条记录成功更新,200条记录失败。所以我想检查批量更新查询哪些所有200条记录都未能更新,我将使用批量插入将它们插入到数据库中。我怎么能做到这一点?发现批量更新的哪些记录失败

+0

不是你的批量查询返回一个int数组来反映记录更新吗? – TheLostMind

+0

是的,但我想知道哪些记录没有更新 –

+0

返回的数组中有值为0的所有记录 – TheLostMind

回答

2

executeBath()方法从Statement返回一个整数数组(每个命令执行一个整数)。每个整数表示更新计数。如果1或更大,则更新成功完成;如果为0,则不会使用其各自的命令更新记录。

实施例:

List<YourClass> objectsToUpdate = getObjectsToUpdate(); 

for (YourClass object : objectsToUpdate) { 
    String updateCommand = generateUpdateCommand(object); 
    statement.addBatch(updateCommand); 
} 
int[] results = statement.executeBatch(); 

List<YourClass> notUpdated = new ArrayList<YourObject>(); 

for (int i = 0; i < results.length; i++) { 
    if (results[i] == 0) { 
     notUpdated.add(objectsToUpdate.get(i)); 
    } 
} 

这只是展示的算法。考虑使用PreparedStatement而不是Statement

+0

但是没有更新的记录(查询失败)我想检索它们。我怎么能够? –

+0

这样的事情:有一个对象的列表/数组,你为每个对象生成一个命令并调用addBatch(),然后调用executeBatch(),它返回一个数组。然后迭代并检查项是否为0.如果为0,则相应数组索引中的对象未更新。 – andrucz

+0

刚刚更新了我的答案。 – andrucz

0

为了完整起见,说使用批量更新时,JDBC驱动程序也可以返回(作为整数数组的一部分)Statement.SUCCESS_NO_INFO(当没有关于更新行的信息时)或Statement.EXECUTE_FAILED(当发生异常时)

某些JDBC驱动程序甚至可能会在异常情况下停止执行进一步的语句(更新)。