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

我目前收到错误,

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

确实如此。有人可以向我解释这个代码吗?如果我对此有更好的理解,我相信我会对如何处理如何使用ReadyStatement结果和用于rs的逻辑有更好的想法。此外,任何帮助来处理改变该逻辑也将不胜感激。


答案 1

至于具体问题,您需要更换SQLException

ResultSet rs = stmt.executeQuery(sql);

ResultSet rs = stmt.executeQuery();

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

另请参阅:


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

另请参阅:


答案 2

将游标从 中的当前位置向外移动一行。所以它很明显意味着如果下一行不是(意味着如果它存在),继续next()resultsetif(rs.next())null

现在,您的问题,

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

请注意,如果您使用 sql 查询作为字符串,则使用 executeQuery(String)。

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

溶液:

用:ResultSet rs = stmt.executeQuery();