← Назад к вопросам

Какой элемент является текущим при начале работы с ResultSet?

2.0 Middle🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Текущий элемент при начале работы с ResultSet

При создании ResultSet из запроса, курсор находится в позиции перед первой строкой. Это означает, что изначально нет "текущего" элемента — необходимо выполнить первый вызов next(), чтобы переместить курсор на первую строку и начать работать с данными.

Как это работает

Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

// На этом этапе курсор находится ДО первой строки
// rs.getInt(1) здесь выдаст исключение

if (rs.next()) {
    // Теперь курсор на ПЕРВОЙ строке результата
    int id = rs.getInt(1);
    String name = rs.getString(2);
}

Особенности работы с курсором

Методы перемещения курсора:

  • next() — переместить на следующую строку (возвращает true если строка существует)
  • previous() — переместить на предыдущую строку (работает только для прокручиваемых ResultSet)
  • first() — перейти на первую строку
  • last() — перейти на последнюю строку
  • absolute(int row) — перейти на конкретную строку по номеру
  • relative(int rows) — переместиться на N строк относительно текущей позиции

Типы ResultSet и поведение курсора

Поведение зависит от типа создаваемого ResultSet:

// TYPE_FORWARD_ONLY (по умолчанию)
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
// Курсор может только двигаться вперед

// TYPE_SCROLL_INSENSITIVE или TYPE_SCROLL_SENSITIVE
Statement stmt = connection.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery(query);
// Курсор может двигаться в обе стороны

Важные моменты

  1. Начальная позиция — всегда перед первой строкой (BeforeFirst)
  2. Необходимость вызова next() — даже если в результате одна строка, нужно вызвать next()
  3. Исключение при доступе без позиционирования — попытка получить значение без вызова next() приведет к SQLException
  4. Итерирование результатов — стандартный способ:
while (rs.next()) {
    // Обработка текущей строки
    System.out.println(rs.getString("name"));
}

Проверка позиции курсора

if (rs.isBeforeFirst()) {
    System.out.println("Курсор до первой строки");
}
if (rs.isFirst()) {
    System.out.println("Курсор на первой строке");
}
if (rs.isLast()) {
    System.out.println("Курсор на последней строке");
}
if (rs.isAfterLast()) {
    System.out.println("Курсор после последней строки");
}

Таким образом, при начале работы с ResultSet текущего элемента нет — курсор находится в позиции BeforeFirst, и требуется вызвать next() для перемещения на первую строку результата.

Какой элемент является текущим при начале работы с ResultSet? | PrepBro