Как устроен и используется ResultSet в JDBC?

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

Ответ

ResultSet — это объект, представляющий результирующую таблицу данных, полученную после выполнения SQL-запроса через Statement или PreparedStatement. Он предоставляет курсор для итерации по строкам результата.

Основные характеристики и типы: При создании Statement можно задать два параметра, определяющих поведение ResultSet:

Параметр Возможные значения Описание
Тип курсора TYPE_FORWARD_ONLY (по умолчанию) Курсор движется только вперед.
TYPE_SCROLL_INSENSITIVE Курсор может двигаться в любом направлении, но не "видит" изменения, сделанные другими транзакциями после открытия.
TYPE_SCROLL_SENSITIVE Курсор может двигаться и "видит" изменения в реальном времени (редко используется, зависит от драйвера БД).
Режим конкурентности CONCUR_READ_ONLY (по умолчанию) Набор данных доступен только для чтения.
CONCUR_UPDATABLE Данные в ResultSet можно обновлять, и изменения будут синхронизированы с базой данных.

Пример использования:

// Создание прокручиваемого ResultSet только для чтения
Statement stmt = connection.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery("SELECT id, name FROM users");

// Итерация по строкам
while (rs.next()) {
    int id = rs.getInt("id"); // Получение значения по имени столбца
    String name = rs.getString(2); // Получение значения по индексу (начиная с 1)
    System.out.println(id + ": " + name);
}

// Прокрутка к первой строке и проверка пустого результата
if (rs.first()) {
    System.out.println("Первая запись: " + rs.getString("name"));
}

// Важно закрывать ресурсы
rs.close();
stmt.close();

Важно: ResultSet, Statement и Connection — это ограниченные ресурсы. Их необходимо закрывать в блоке finally или, что предпочтительнее, использовать конструкцию try-with-resources (доступна с Java 7).