Находится ли курсор ResultSet на первой строке сразу после выполнения запроса?

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

Ответ

Нет. Сразу после выполнения запроса и получения объекта ResultSet его курсор располагается перед первой строкой (before-first position). Для доступа к данным необходимо явно переместить курсор на первую строку.

Ключевой метод — next():

  • Первый вызов next() перемещает курсор с позиции перед первой строкой на первую строку.
  • Каждый последующий вызов next() перемещает курсор на следующую строку.
  • Метод возвращает true, если новая текущая строка существует, и false, когда строк больше нет.

Пример корректного обхода:

ResultSet rs = statement.executeQuery("SELECT id, name FROM users");
// Курсор сейчас ПЕРЕД первой строкой. Вызов rs.getInt("id") здесь выбросит SQLException.

while (rs.next()) { // Перемещает курсор и проверяет наличие строки
    int id = rs.getInt("id");        // Чтение данных текущей строки
    String name = rs.getString("name");
    System.out.println(id + ": " + name);
}
// После выхода из цикла курсор находится ПОСЛЕ последней строки.

Важно: Без предварительного успешного вызова next() любые попытки получить данные (getInt, getString и т.д.) приведут к SQLException с сообщением, подобным "ResultSet before start of result set".