Это было адаптировано из кода, который у меня уже есть ... может быть одна или две ошибки, но суть будет работать (это работает в моем коде).В идеале подобные вещи должны выполняться с помощью инструмента ORM, такого как Hiberante.
По сути, вы настраиваете пакетное обновление, а затем запускаете Statement.executeBatch () для фактического обновления.Вы возвращаетесь с массивом int [] с результатами.Вы проверяете их по списку предопределенных констант, чтобы увидеть, что происходит.Это НАМНОГО быстрее, чем просто выполнять каждое обновление отдельно.Кроме того, вы можете объединить все обновления в одну транзакцию, упрощая откат.
public void updateResNames(List<ResAllocationDTO> list) {
String sql = "UPDATE res_allocation SET ResName = ? WHERE PID = ?";
PreparedStatement statement = null;
try {
statement = connection.prepareStatement(sql);
for (ResAllocationDTO dto : list) {
statement.setString(1, dto.getResName());
statement.setString(2, dto.getPID());
statement.addBatch();
}
int[] result = statement.executeBatch();
for (int i = 0; i < result.length; i++) {
if (result[i] == PreparedStatement.EXECUTE_FAILED) {
throw new SQLException(String.format("Entry %d failed to execute in the batch insert with a return code of %d.", i, result[i]));
}
}
commit();
} catch (SQLException e) {
logger.error(LoggerCodes.DATABASE_ERROR, e);
rollback();
throw new RuntimeException(e);
} finally {
close(statement);
}
}
commit (), close () и rollback () выглядит следующим образом:
public void close(PreparedStatement statement) {
try {
if (statement != null && !statement.isClosed())
statement.close();
} catch (SQLException e) {
logger.debug(LoggerCodes.TRACE, "Warning! PreparedStatement could not be closed.");
}
}
protected void commit() {
try {
if ((connection != null) && !connection.getAutoCommit()) {
connection.commit();
}
} catch (SQLException e) {
logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after commit.");
}
}
protected void rollback() {
try {
if ((connection != null) && !connection.getAutoCommit()) {
connection.rollback();
}
} catch (SQLException e) {
logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after rollback.");
}
}
Iнадеюсь, это поможет вам!Удачи и удачного кодирования!