Какие параметры можно настроить у ResultSet в JDBC?

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

Ответ

При создании Statement или PreparedStatement в JDBC можно настроить три ключевых параметра ResultSet, определяющих его поведение.

1. Тип курсора (ResultSet Type)

  • TYPE_FORWARD_ONLY (по умолчанию): Курсор движется только вперед.
  • TYPE_SCROLL_INSENSITIVE: Курсор может двигаться в любом направлении (previous(), absolute()), но не отражает изменения, сделанные другими транзакциями в базе данных после открытия ResultSet.
  • TYPE_SCROLL_SENSITIVE: Курсор скроллируется и отражает изменения в данных, сделанные другими транзакциями.

2. Режим конкурентности (Concurrency Mode)

  • CONCUR_READ_ONLY (по умолчанию): Набор результатов доступен только для чтения.
  • CONCUR_UPDATABLE: Данные в ResultSet можно обновлять, удалять или вставлять новые строки с помощью методов updateXXX(), updateRow(), deleteRow(), insertRow(). Поддержка зависит от СУБД и запроса.

3. Удержание курсора (Cursor Holdability) Определяет, остается ли ResultSet открытым после вызова Connection.commit().

  • HOLD_CURSORS_OVER_COMMIT: Курсоры остаются открытыми.
  • CLOSE_CURSORS_AT_COMMIT: Курсоры закрываются автоматически.

Пример создания настраиваемого Statement:

// Создание Statement с прокручиваемым и обновляемым ResultSet
Statement stmt = connection.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_UPDATABLE
);
ResultSet rs = stmt.executeQuery("SELECT id, name FROM employees");

// Использование возможностей
rs.absolute(5); // Переход к 5-й строке
rs.updateString("name", "Новое Имя");
rs.updateRow(); // Фиксация изменения в БД

Важно: Поддержка CONCUR_UPDATABLE и TYPE_SCROLL_SENSITIVE зависит от драйвера базы данных и самого запроса (например, запрос к одной таблице обычно поддерживается).