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

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

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

 ResultSet rs = stmt.executeQuery(sql); 

通过

 ResultSet rs = stmt.executeQuery(); 

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

也可以看看:

  • JDBC教程 – 使用准备语句

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

也可以看看:

  • ResultSet#next() Javadoc ResultSet#next()方法
  • SQL中的问题,java中的ResultSet

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

ResultSet.next()方法的JavaDoc指出:

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

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

所以, if(rs.next(){ //do something }意味着“如果结果集仍有结果,则转到下一个结果并做一些事情”。

正如BalusC指出的那样 ,你需要更换

 ResultSet rs = stmt.executeQuery(sql); 

 ResultSet rs = stmt.executeQuery(); 

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

 PreparedStatement stmt = conn.prepareStatement(sql); 

如果您没有使用PreparedStatement ,那么ResultSet rs = stmt.executeQuery(sql); 会工作。

next()将光标从resultset集中的当前位置向前移动一行。 所以很明显if(rs.next())意味着如果下一行不为null (意味着它存在), 那就前进吧

现在问你的问题,

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

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

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

方案:

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

next()方法( 这里的官方文档)只是将结果行的指针设置为下一行(如果可以的话)。 无论如何,你也可以从官方文档中读到这个:

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

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

查看图片,它是来自员工的查询select *的结果集

在此处输入图像描述

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

🙂

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

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

很简单,如果你的ResultSet包含结果,那么使用rs.next如果你有记录集则返回true,否则返回false。

首先,你不需要写

 ResultSet rs = stmt.executeQuery(sql); 

写吧

 ResultSet rs = stmt.executeQuery(); 

上述语法用于不用于PreparedStatement的语句。

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