jdbc эффективно получает сгенерированные ключи вместе с другими данными

#jdbc #batch-file

#jdbc #пакетный файл

Вопрос:

После пакетной вставки нескольких строк я хочу получить сгенерированные ключи вместе с соответствующими вставленными строками. как мне сделать это эффективно?
Наивно я могу использовать statement.getGeneratedKeys() для запроса базы данных для каждой строки на основе каждого сгенерированного идентификатора, но это кажется медленным.
приведенный ниже код выполняет пакетную вставку, а затем просматривает все результаты в таблице, однако я не хочу включать данные, которые уже существуют в таблице до вставки.
есть ли альтернатива?

 public static void main(String[] args) выдает исключение {
 Connection conn = getMySqlConnection();
 Результирующий набор rs = null;
 Оператор stmt = null;
 попробуйте {
conn = getMySqlConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
 Набор результатов.CONCURRENT_UPDATABLE);
 conn.setAutoCommit(false);
 stmt.addBatch("ВСТАВИТЬ В ЗНАЧЕНИЯ опроса (id, name) ('11', 'Alex')");
 stmt.addBatch("ВСТАВИТЬ В ЗНАЧЕНИЯ опроса (id, name) ('22', 'Mary')");
 stmt.addBatch("ВСТАВИТЬ В ЗНАЧЕНИЯ опроса (id, name) ('33', 'Bob')");
 int[] updateCounts = stmt.executeBatch();
 System.out.println(количество обновлений);
 conn.commit();
 rs = stmt.ExecuteQuery("ВЫБРАТЬ * ИЗ опроса");
 while (rs.next()) {
 Идентификатор строки = rs.getString("id");
 Имя строки = rs.getString("имя");
 System.out.println("id="  id  " name=" name);
 }
 }
catch(BatchUpdateException b) {
 System.err.println("SQLException: "   b.GetMessage());
 System.err.println("SQLState: "   b.getSQLState());
 System.err.println("Сообщение: "   b.GetMessage());
 System.err.println("Код ошибки поставщика: "   b.getErrorCode());
 System.err.print("Количество обновлений: ");
 int [] updateCounts = b.getUpdateCounts();
for (int i = 0; i < updateCounts.длина; i  ) {
 System.err.print(updateCounts[i]   " ");
 }
 }
catch(SQLException ex) {
 System.err.println("SQLException: "   ex.GetMessage());
 System.err.println("SQLState: "   ex.getSQLState());
 System.err.println("Сообщение: "   ex.GetMessage());
 System.err.println("Код ошибки поставщика: "   ex.getErrorCode());
 }
 перехват (исключение e) {
e.printStackTrace();
 System.err.println("Исключение: "   e.GetMessage());
 }
 наконец {
rs.close();
stmt.close();
conn.close();
 }
 }

Ответ №1:

У вас есть список интересующих вас идентификаторов. Вы можете использовать ограничение ‘id в (…, …,)‘:

 StringBuilder newIds = new StringBuilder();
ResultSet rs = stmt.getGeneratedKeys();
while (rs.next()) {
  if (newIds.length() > 0)  newIds.append(',');
  newIds.append(rs.getInt(1));
}

if (newIds.length() > ) {
  rs = stmt.executeQuery("SELECT * FROM survey where id in (" newIds ")");
  ...
}