Существует коллекция с множеством предметов.Коллекция отображается в виде таблицы.Пользователь в автономном режиме может добавлять и удалять записи, а также обновлять ранее полученные с помощью SELECT * FROM ...
Я хочу реализовать функцию «Сохранить все», при которой программа будет проходить через всеколлекции и обновлять записи в базе данных, если они существуют, и добавлять новые, если они не существуют.
Пришел к следующему решению (сторона Java):
@Override
public void updateAll(List<User> users)
{
//online
Connection connection = null;
PreparedStatement statement = null;
try
{
connection = Database.getInstance().getConnection();
connection.setAutoCommit(false);
for (User user : users)
{
statement = connection.prepareStatement(""); //THIS IS WHERE A CORRECT QUERY SHOULD BE CREATED
statement.execute();
}
connection.commit();
}
catch (SQLException ex)
{
Log.error("Unable to updateAll users. " + ex.getMessage());
}
finally
{
Database.closeQuietly(statement);
Database.closeQuietly(connection);
}
}
Посколькусодержимое таблицы может быть значительно обновлено, но это необходимо для быстрого сохранения, я отключаю автоматическую фиксацию и отправляю по одной большой партии запросов за раз.
Теперь о самом запросе ... I обнаружил , что PostgreSQL поддерживает необходимую мне функциональность:
INSERT INTO the_table (id, column_1, column_2)
VALUES (1, 'A', 'X'), (2, 'B', 'Y'), (3, 'C', 'Z')
ON CONFLICT (id) DO UPDATE
SET column_1 = excluded.column_1,
column_2 = excluded.column_2;
Сразу возникло несколько вопросов:
- Теперь мне нужно поместить это в PreparedStatement.Я знаю, как безопасно вставить данные в часть запроса INSERT, но как насчет части UPDATE, где вам нужно перечислить все данные в скобках - кроме объединения строк, ничего не пришло в голову, но, насколько я знаю,это не путь джедая.
- Поскольку мне нужно обновлять данные чаще, чем вставлять новые, правильно ли использовать часть INSERT в качестве основы и только затем выполнять UPDATE, если она существует?Может быть, мне не стоит беспокоиться, а может, это действительно повлияет на скорость?Своп?Но как?