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

Java “if(rs.next())”是什么意思?,java,string,prepared-statement,resultset,sqlexception,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 (r

我现在得到了错误信息

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使用的逻辑有更好的了解。同时,如果能够帮助处理更改该逻辑,我将不胜感激。

如果需要,下一个官方文档方法就是将结果行集合的指针移动到下一行可以无论如何,您也可以从官方文件中阅读:

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


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

至于该SQLException的具体问题,您需要替换它

ResultSet rs = stmt.executeQuery(sql);

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

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

另见: 下一步将光标从其在结果集中的当前位置向前移动一行。因此很明显,ifrs.next意味着如果下一行不为空,则意味着如果它存在,则继续

现在不是你的问题

ResultSet rs = stmt.executeQuery(sql);  //This is wrong
                                  ^       
请注意,如果您将sql查询用作字符串,则会使用该选项

而当您使用时,则使用它执行此PreparedStatement对象中的SQL查询并返回查询生成的ResultSet对象

解决方案:


用法:ResultSet rs=stmt.executeQuery

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

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


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

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


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

首先,您不需要编写

ResultSet rs = stmt.executeQuery(sql);
只要写

ResultSet rs = stmt.executeQuery();
上述语法用于语句而不是PreparedStatement


其次,rs.next检查结果集是否包含任何值。它返回一个布尔值,并将光标移动到结果集中的第一个值,因为它最初位于第一个位置之前。因此,如果您想访问结果集中的第一个值,您需要编写rs.next。

我假定您使用的是Java 6,并且您使用的结果集是Java.sql.ResultSet

各国:

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

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

因此,ifrs.next{//do something}意味着如果结果集仍然有结果,则移动到下一个结果并执行一些操作

,您需要更换

ResultSet rs = stmt.executeQuery(sql);

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

PreparedStatement stmt = conn.prepareStatement(sql);

如果您没有使用PreparedStatement,则ResultSet rs=stmt.executeQuerysql;会有用的。

非常感谢!这帮了大忙@土耳其人,为你辩护,例外的解释一点也不清楚。这意味着您使用了错误的方法,而不是错误的参数。非常感谢!你很好地解释了我需要做出的改变!谢谢,这正是我需要的。对不起,没有足够的代表来做这件事。
ResultSet rs = stmt.executeQuery();
PreparedStatement stmt = conn.prepareStatement(sql);