2012-10-29 39 views
0

我认为这个问题总结得不错,这是我的代码,但它没有给我所需的结果。我想返回一个int数组,其中包含为该批次中创建的每一行生成的自动递增ID。如何知道使用JDBC为批量更新创建的自动增量值?

CREATE_APPOINTMENT = database.prepareStatement("INSERT INTO " + TABLE_APPOINTMENTS + " VALUES (?, ?, ?, ?, ?)"); 

    public static int[] createAppointment(Appointment... appointments) { 
    int[] ids = new int[appointments.length]; 
    int count = 0; 
    try { 
     for (Appointment a : appointments) { 
      CREATE_APPOINTMENT.setDate(2, a.date); 
      CREATE_APPOINTMENT.setTime(3, a.time); 
      CREATE_APPOINTMENT.setInt(4, a.duration); 
      CREATE_APPOINTMENT.setString(5, a.clientName); 
      CREATE_APPOINTMENT.addBatch(); 
     } 
     CREATE_APPOINTMENT.executeBatch(); 

     ResultSet resultSet = CREATE_APPOINTMENT.getGeneratedKeys(); 
     if (resultSet != null) 
      while (resultSet.next()) { 
       ids[count++] = resultSet.getInt(1); 
      } 

    } catch (SQLException ex) { 
     System.err.println(ex); 
    } 
    return ids; 
} 

我试图创建根据数据库8个约会和他们的ID是成功创建,但我返回数组只包含最后一个ID,其余均为零。我在哪里错过了什么?

回答

1

其实这是不可能的。 stmt.getGeneratedKeys()将总是返回只有一个值,因为这种方法在源码-JDBC驱动被实现:

 

    ResultSet getGeneratedKeys() throws SQLException { 
      if (getGeneratedKeys == null) 
       getGeneratedKeys = conn.prepareStatement("select last_insert_rowid();"); 
      return getGeneratedKeys.executeQuery(); 
     } 

你的阵列与零个值进行初始化,然后将最后生成的ID被分配到数组的第一个元素。

0

好了,JDBC Specification 13.6节:检索自动生成的值提供了有关如何做到这一点的信息:

String keyColumn[] = {"ORDER_ID"}; 
... 
Statement stmt = conn.createStatement(); 
int rows = stmt.executeUpdate("INSERT INTO ORDERS " + 
"(ISBN, CUSTOMERID) " + 
"VALUES (966431502, ’BILLG’)", 
keyColumn); 
ResultSet rs = stmt.getGeneratedKeys(); 

两段这个例子后的规范说:

它的定义与实现至于getGeneratedKeys是否会在调用executeBatch方法后返回生成的值。

所以,我想你可以测试你的驱动程序,看看它是否支持它。

+0

如果没有,您可以随时执行查询'SELECT last_insert_rowid()'。 –

+0

@CL不会返回最后一次插入的行ID吗?我认为这个问题是关于批量插入的。另外,即使在单一插入场景中,我认为它只在隔离级别保证你只能看到你自己的最后一个插入时才起作用。 –

+0

是的,使用批处理时,您需要JDBC驱动程序中的支持。 –

1

尝试改变准备这样的语句:

CREATE_APPOINTMENT = database.prepareStatement("INSERT INTO " + TABLE_APPOINTMENTS + " VALUES (?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS); 
+0

可悲的是没有改变任何东西。 – rtheunissen

+0

是的,请参阅下面的解释。 – vnd