“如果(rs.next())”是啥意思?

Posted

技术标签:

【中文标题】“如果(rs.next())”是啥意思?【英文标题】:What does "if (rs.next())" mean?“如果(rs.next())”是什么意思? 【发布时间】:2011-11-20 04:25:25 【问题描述】:

我目前遇到了错误,

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 的逻辑有更好的了解。此外,对于处理更改该逻辑的任何帮助也将不胜感激。

【问题讨论】:

【参考方案1】:

至于那个SQLException的具体问题,你需要替换

ResultSet rs = stmt.executeQuery(sql);

通过

ResultSet rs = stmt.executeQuery();

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

另见:

JDBC tutorial - Using Prepared Statements

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

另见:

Javadoc on ResultSet#next() method Problem with SQL, ResultSet in java

【讨论】:

非常感谢!这很有帮助! @Turk 为您辩护,异常解释根本不是很清楚。这意味着您使用了错误的方法而不是错误的参数。【参考方案2】:

next() 将光标从resultset 中的当前位置向前移动一行。所以很明显if(rs.next()) 表示如果下一行不是null(表示如果存在),Go Ahead

现在解决你的问题,

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

请注意,executeQuery(String) 用于将 sql 查询用作字符串。

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

解决方案:

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

【讨论】:

非常感谢!你解释了我需要做出很好的改变!【参考方案3】:

next() 方法(官方文档here)只需将结果行集的指针移动到下一行(如果可以的话)。无论如何,您也可以从官方文档中阅读:

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

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

【讨论】:

【参考方案4】:

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

JavaDoc for the ResultSet.next() method 声明:

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

当调用 next 方法返回 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); 可以工作。

【讨论】:

谢谢你,这正是我所需要的。 抱歉,没有足够的代表来做这件事。【参考方案5】:

看图,是查询select * from employee的结果集

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

:)

【讨论】:

【参考方案6】:

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

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

简而言之,如果您的 ResultSet 包含结果,则使用 rs.next 如果您有记录集则返回 true,否则返回 false。

【讨论】:

【参考方案7】:

首先,你不需要写

ResultSet rs = stmt.executeQuery(sql);

随便写

ResultSet rs = stmt.executeQuery();

上述语法用于 Statements 而不是 PreparedStatement。

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

【讨论】:

以上是关于“如果(rs.next())”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

这些标签是啥意思[如果 IE 8]?

我不明白如果消息过程只能使用一次,应该使用 trident 是啥意思

如果 console.log(4) 在 Chrome 控制台中输出 undefined 是啥意思?

wwwjoy69是啥意思

Ruby 中的 *(星号)是啥意思? [复制]

||= 在 Ruby 中是啥意思? [复制]