Что значит "if (rs.next ())"? - PullRequest
       47

Что значит "if (rs.next ())"?

10 голосов
/ 20 ноября 2011

Я сейчас получаю ошибку,

java.sql.SQLException: Method 'executeQuery(String)' not allowed on prepared statement.

потому что я использую

PreparedStatement stmt = conn.prepareStatement(sql);

а также имел

ResultSet rs = stmt.executeQuery(sql);

в моем коде.

Теперь мне нужно удалить строку ResultSet, но мне остается иметь дело со следующим кодом:

if (rs.next()) {
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("login.successful"));
    request.getSession(true).setAttribute("USERNAME", rs.getString("USERNAME"));
    request.getSession(true).setAttribute("BALANCE", rs.getString("BALANCE"));
    request.setAttribute("msg", "Logged in successfully");

Я не уверен, что полностью понимаю, что

 if (rs.next())

делает. Может ли кто-нибудь объяснить мне этот код? Если у меня будет лучшее понимание этого, я верю, что у меня будет лучшее представление о том, как действовать, используя результаты PreparedStatement с логикой, используемой для rs. Также любая помощь, чтобы иметь дело с изменением этой логики была бы очень признательна.

Ответы [ 7 ]

7 голосов
/ 20 ноября 2011

Что касается конкретной проблемы с SQLException, вам нужно заменить

ResultSet rs = stmt.executeQuery(sql);

от

ResultSet rs = stmt.executeQuery();

потому что вы используете подкласс PreparedStatement вместо Statement. При использовании PreparedStatement вы уже передали строку SQL в Connection#prepareStatement(). Вам просто нужно установить параметры для него и затем вызвать метод executeQuery() напрямую, без повторной передачи строки SQL.

Смотри также:


Что касается конкретного вопроса о rs.next(), он перемещает курсор на следующую строку набора результатов из базы данных и возвращает true, если есть какая-либо строка, в противном случае false. В сочетании с оператором if (вместо while) это означает, что программист ожидает или интересуется только одной строкой, первой строкой.

Смотри также:

4 голосов
/ 20 ноября 2011

next() перемещает курсор на одну строку от его текущей позиции в resultset.поэтому очевидно, что if(rs.next()) означает, что если следующая строка не null (значит, если она существует), Go Ahead .

Теперь по вашей проблеме,

ResultSet rs = stmt.executeQuery(sql);  //This is wrong
                                  ^       

обратите внимание, что executeQuery (String) используется, если вы используете sql-запрос в качестве строки.

В то время как при использовании PreparedStatement используйте executeQuery () , который выполняет запрос SQL в этом объекте PreparedStatement и возвращает объект ResultSet, сгенерированный запросом.

Решение:

Использование: ResultSet rs = stmt.executeQuery();

3 голосов
/ 20 ноября 2011

Я предполагаю, что вы используете Java 6 и что ResultSet, который вы используете, это java.sql.ResultSet.

JavaDoc для метода ResultSet.next () сообщает:

Перемещает курсор на одну строку от текущей позиции. Курсор ResultSet изначально расположен перед первой строкой; первый вызов метода next делает первую строку текущей строкой; второй вызов делает вторую строку текущей строкой и т. д.

Когда при вызове следующего метода возвращается false, курсор располагается после последней строки. Любой вызов метода ResultSet, для которого требуется текущая строка, приведет к возникновению исключения SQLException.

Итак, if(rs.next(){ //do something } означает «Если набор результатов все еще имеет результаты, перейдите к следующему результату и сделайте что-нибудь».

Как указал BalusC , вам необходимо заменить

ResultSet rs = stmt.executeQuery(sql);

с

ResultSet rs = stmt.executeQuery();

Поскольку вы уже установили SQL для использования в операторе с предыдущей строкой

PreparedStatement stmt = conn.prepareStatement(sql);

Если вы не используете PreparedStatement, тогда ResultSet rs = stmt.executeQuery(sql); будет работать.

2 голосов
/ 20 ноября 2011

Метод next() (официальный документ здесь ) просто перемещает указатель строк результатов, установленных на следующую строку (если это возможно). В любом случае вы также можете прочитать это из официального документа:

Перемещает курсор на одну строку вниз от текущей позиции.

Этот метод возвращает true, если есть другая строка, или false в противном случае.

0 голосов
/ 20 ноября 2011

Во-первых, вам не нужно писать

ResultSet rs = stmt.executeQuery(sql);

, просто пишите

ResultSet rs = stmt.executeQuery();

Вышеупомянутый синтаксис используется для операторов, а не для PreparedStatement.

Во-вторых, rs.next () проверяет, содержит ли результирующий набор какие-либо значения или нет.Он возвращает логическое значение, а также перемещает курсор к первому значению в наборе результатов, потому что изначально он находится в ПЕРЕД ПЕРВОЙ позиции.Поэтому, если вы хотите получить доступ к первому значению в наборе результатов, вам нужно написать rs.next ().

0 голосов
/ 20 ноября 2011

Поскольку Result Set является интерфейсом, когда вы получаете ссылку на ResultSet через вызов JDBC, вы получаете экземпляр класса, который реализует интерфейс ResultSet. Этот класс предоставляет конкретные реализации всех методов ResultSet.

Интерфейсы используются для отделения реализации от интерфейса. Это позволяет создавать общие алгоритмы и абстракцию создания объекта. Например, драйверы JDBC для разных баз данных будут возвращать разные реализации ResultSet, но вам не нужно менять код, чтобы он работал с разными драйверами

Короче говоря, если ваш ResultSet содержит результат, то с помощью rs.next возвращает true, если у вас есть набор записей, иначе он возвращает false.

0 голосов
/ 20 ноября 2011

Посмотрите на картинку, это результирующий набор запроса select * from employee

enter image description here

, а метод next () класса ResultSet помогает переместить курсор наследующий ряд возвращаемого набора результатов, который в вашем примере является rs.

:)

...