Можно ли напрямую изменить данные в базе через объект ResultSet в JDBC?

«Можно ли напрямую изменить данные в базе через объект ResultSet в JDBC?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обычно — нет. Стандартный ResultSet предназначен только для чтения данных. Для модификации данных в БД необходимо выполнять SQL-команды UPDATE, INSERT или DELETE через Statement или PreparedStatement.

Правильный подход:

// 1. Получаем данные для чтения
ResultSet rs = statement.executeQuery("SELECT id, name FROM users WHERE id = 1");

if (rs.next()) {
    // 2. Определяем новое значение
    String newName = "UpdatedName";
    // 3. Выполняем отдельный запрос на обновление
    PreparedStatement pstmt = connection.prepareStatement("UPDATE users SET name = ? WHERE id = ?");
    pstmt.setString(1, newName);
    pstmt.setInt(2, rs.getInt("id"));
    pstmt.executeUpdate(); // Данные изменяются здесь
}

Исключение: обновляемый ResultSet. Можно создать ResultSet с поддержкой обновления, указав CONCUR_UPDATABLE. Однако эта возможность поддерживается не всеми СУБД/драйверами и требует явного вызова методов updateXxx() и updateRow().

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE id=1");
if (rs.next()) {
    rs.updateString("name", "NewName");
    rs.updateRow(); // Критически важный вызов для фиксации в БД
}