“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()
JavadocResultSet#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()。