← Назад к вопросам
Какой элемент является текущим при начале работы с 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);
// Курсор может двигаться в обе стороны
Важные моменты
- Начальная позиция — всегда перед первой строкой (BeforeFirst)
- Необходимость вызова next() — даже если в результате одна строка, нужно вызвать
next() - Исключение при доступе без позиционирования — попытка получить значение без вызова
next()приведет к SQLException - Итерирование результатов — стандартный способ:
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() для перемещения на первую строку результата.