#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 ")");
...
}