“if(rs.next())”是什么意思?

时间:2011-11-20 04:25:26

标签: java string prepared-statement resultset sqlexception

我目前收到错误,

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())

一样。有人可以向我解释这段代码吗?如果我对此有了更好的理解,我相信我会更好地了解如何使用用于rs的逻辑来处理PreparedStatement结果。此外,对于改变逻辑的任何帮助也将非常感激。

7 个答案:

答案 0 :(得分:7)

关于SQLException的具体问题,您需要替换

ResultSet rs = stmt.executeQuery(sql);

通过

ResultSet rs = stmt.executeQuery();

因为您使用的是PreparedStatement子类而不是Statement。使用PreparedStatement时,您已经将SQL字符串传递给Connection#prepareStatement()。您只需在其上设置参数,然后直接调用executeQuery()方法,而无需重新传递SQL字符串。

另见:


关于rs.next()的具体问题,它将光标移动到数据库中结果集的下一行,如果有任何行,则返回true,否则返回false。结合if语句(而不是while),这意味着程序员只期望或只对第一行感兴趣。

另见:

答案 1 :(得分:4)

next()将光标从resultset中的当前位置向前移动一行。显而易见if(rs.next())表示如果下一行不是null(意味着它存在),前进

现在问题,

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

请注意,如果您将sql-query用作字符串,则使用executeQuery(String)

当您使用PreparedStatement时,使用executeQuery()执行此PreparedStatement对象中的SQL查询,并返回查询生成的ResultSet对象。

解决方案:

使用:ResultSet rs = stmt.executeQuery();

答案 2 :(得分:3)

我假设您使用的是Java 6,并且您使用的ResultSet是java.sql.ResultSet

JavaDoc for the ResultSet.next() method州:

  

将光标从当前位置向前移动一行。 ResultSet游标最初位于第一行之前;对方法的第一次调用使得第一行成为当前行;第二个调用使第二行成为当前行,依此类推。

     

当对下一个方法的调用返回false时,光标位于最后一行之后。任何需要当前行的ResultSet方法的调用都将导致抛出SQLException。

因此,if(rs.next(){ //do something }表示“如果结果集仍有结果,请移至下一个结果并执行某些操作”。

As BalusC pointed out,您需要替换

ResultSet rs = stmt.executeQuery(sql);

ResultSet rs = stmt.executeQuery();

因为您已经在上一行的语句中设置了要使用的SQL

PreparedStatement stmt = conn.prepareStatement(sql);

如果您没有使用PreparedStatement,那么ResultSet rs = stmt.executeQuery(sql);就可以了。

答案 3 :(得分:2)

next()方法(官方文档here)只是将结果行的指针设置为下一行(如果可以)。无论如何,你也可以从官方文档中读到这个:

  

将光标从当前位置向下移动一行。

如果有另一行,则此方法返回true,否则返回false。

答案 4 :(得分:0)

查看图片,它是查询select * from employee

的结果集

enter image description here

和ResultSet类的next()方法有助于将光标移动到返回结果集的下一行,在您的示例中为rs。

:)

答案 5 :(得分:0)

由于Result Set是一个接口,当您通过JDBC调用获得对ResultSet的引用时,您将获得一个实现ResultSet接口的类的实例。此类提供了所有ResultSet方法的具体实现。

接口用于将实现与接口分离。这允许创建通用算法和对象创建的抽象。例如,不同数据库的JDBC驱动程序将返回不同的ResultSet实现,但您不必更改代码以使其适用于不同的驱动程序

非常简短,如果你的ResultSet包含结果,那么使用rs.next如果你有记录集则返回true,否则返回false。

答案 6 :(得分:0)

首先,你不需要写

ResultSet rs = stmt.executeQuery(sql);

写一下

ResultSet rs = stmt.executeQuery();

上述语法用于不用于PreparedStatement的语句。

第二件事,rs.next()检查结果集是否包含任何值。它返回一个布尔值,并将光标移动到结果集中的第一个值,因为它最初位于BEFORE FIRST Position。因此,如果要访问结果集中的第一个值,则需要编写rs.next()。