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

Tur*_*urk 10 java string sqlexception resultset prepared-statement

我目前收到错误,

java.sql.SQLException: Method 'executeQuery(String)' not allowed on prepared statement.
Run Code Online (Sandbox Code Playgroud)

因为我正在使用

PreparedStatement stmt = conn.prepareStatement(sql);
Run Code Online (Sandbox Code Playgroud)

还有

ResultSet rs = stmt.executeQuery(sql);
Run Code Online (Sandbox Code Playgroud)

在我的代码中.

我现在需要删除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");
Run Code Online (Sandbox Code Playgroud)

我不确定我完全明白什么

 if (rs.next())
Run Code Online (Sandbox Code Playgroud)

确实.有人可以向我解释这段代码吗?如果我对此有了更好的理解,我相信我会更好地了解如何使用用于rs的逻辑来处理PreparedStatement结果.此外,任何有助于改变逻辑的帮助也将受到高度赞赏.

Bal*_*usC 7

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

ResultSet rs = stmt.executeQuery(sql);
Run Code Online (Sandbox Code Playgroud)

通过

ResultSet rs = stmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:


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

也可以看看:


COD*_*BOY 5

next()移动光标从当前位置前移一行resultset。所以很明显这if(rs.next())意味着如果下一行不是null(意味着如果它存在),则继续

现在解决你的问题,

ResultSet rs = stmt.executeQuery(sql);  //This is wrong
                                  ^       
Run Code Online (Sandbox Code Playgroud)

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

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

解决方案 :

用 : ResultSet rs = stmt.executeQuery();