В спецификации это упоминается:
Это верно даже в том случае, если работа выполняется внутри инициируемой конструктором микрозадачи, поскольку контрольная точка для микрозадачи может возникнуть сразу после построения. [ 112] BLOCKQUOTE>
Верно, изначально курсор ResultSet
указывает на перед первой строкой, если первый вызов next ()
возвращает ] false
, то в ResultSet
не было данных.
Если вы используете этот метод, вам может потребоваться вызвать beforeFirst ()
сразу после его сброса, так как теперь он позиционируется за первой строкой.
Следует отметить, однако, что ответ Сейфера ниже является более элегантным решением этого вопроса.
Это сработает, если вы хотите увидеть, есть ли какие-нибудь строки в результирующем наборе. Да.
Обратите внимание, что next ()
всегда перемещается к следующей строке, поэтому, если вы планируете выполнять какое-либо чтение из набора результатов, вы должны это учитывать.
Обычное использование с ResultSet ( при простом чтении) это:
while (resultSet.next())
{
... read from the row here ...
}
Что, очевидно, не будет работать правильно, если вы уже один раз вызываете next ()
, чтобы проверить, был ли набор результатов пуст, так что следите за этим. Хотя существуют методы "резервного копирования", они поддерживаются не для всех типов наборов результатов.
Обычно вы делаете что-то вроде этого:
while ( resultSet.next() ) {
// Read the next item
resultSet.getString("columnName");
}
Если вы хотите сообщить о пустом наборе, добавьте переменную, подсчитывающую прочитанные элементы. Если вам нужно прочитать только один элемент, тогда вашего кода достаточно.
вы всегда можете выполнить следующий шаг вперед и просто выполнить проверку цикла после завершения
if (!resultSet.next() ) {
System.out.println("no data");
} else {
do {
//statement(s)
} while (resultSet.next());
}