[英]How can I know what auto-increment values were created for a batch update using JDBC?
我认为这个问题总结得很好,这是我目前的代码,但它没有给我所需的结果。 我想返回一个int数组,其中包含为该批处理中创建的每一行生成的自动增量ID。
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,其余为零。 我在哪里错过了什么?
尝试更改这样的准备语句:
CREATE_APPOINTMENT = database.prepareStatement("INSERT INTO " + TABLE_APPOINTMENTS + " VALUES (?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
实际上这是不可能的。 stmt.getGeneratedKeys()将始终只返回一个值,因为sqlite-jdbc驱动程序中的此方法实现如下:
ResultSet getGeneratedKeys() throws SQLException { if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement("select last_insert_rowid();"); return getGeneratedKeys.executeQuery(); }
您的数组初始化为零值,然后将最后生成的ID分配给数组的第一个元素。
那么, JDBC规范部分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方法后返回生成的值。
所以,我想你可以测试你的驱动程序,看它是否支持它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.