“如果(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 onResultSet#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())”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
我不明白如果消息过程只能使用一次,应该使用 trident 是啥意思