我目前收到错误,
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())
一样。有人可以向我解释这段代码吗?如果我对此有了更好的理解,我相信我会更好地了解如何使用用于rs的逻辑来处理PreparedStatement结果。此外,对于改变逻辑的任何帮助也将非常感激。
答案 0 :(得分:7)
关于SQLException
的具体问题,您需要替换
ResultSet rs = stmt.executeQuery(sql);
通过
ResultSet rs = stmt.executeQuery();
因为您使用的是PreparedStatement
子类而不是Statement
。使用PreparedStatement
时,您已经将SQL字符串传递给Connection#prepareStatement()
。您只需在其上设置参数,然后直接调用executeQuery()
方法,而无需重新传递SQL字符串。
关于rs.next()
的具体问题,它将光标移动到数据库中结果集的下一行,如果有任何行,则返回true
,否则返回false
。结合if
语句(而不是while
),这意味着程序员只期望或只对第一行感兴趣。
答案 1 :(得分:4)
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();
答案 2 :(得分:3)
我假设您使用的是Java 6,并且您使用的ResultSet是java.sql.ResultSet
。
JavaDoc for the ResultSet.next() method州:
将光标从当前位置向前移动一行。 ResultSet游标最初位于第一行之前;对方法的第一次调用使得第一行成为当前行;第二个调用使第二行成为当前行,依此类推。
当对下一个方法的调用返回false时,光标位于最后一行之后。任何需要当前行的ResultSet方法的调用都将导致抛出SQLException。
因此,if(rs.next(){ //do something }
表示“如果结果集仍有结果,请移至下一个结果并执行某些操作”。
As BalusC pointed out,您需要替换
ResultSet rs = stmt.executeQuery(sql);
与
ResultSet rs = stmt.executeQuery();
因为您已经在上一行的语句中设置了要使用的SQL
PreparedStatement stmt = conn.prepareStatement(sql);
如果您没有使用PreparedStatement
,那么ResultSet rs = stmt.executeQuery(sql);
就可以了。
答案 3 :(得分:2)
next()
方法(官方文档here)只是将结果行的指针设置为下一行(如果可以)。无论如何,你也可以从官方文档中读到这个:
将光标从当前位置向下移动一行。
如果有另一行,则此方法返回true,否则返回false。
答案 4 :(得分:0)
查看图片,它是查询select * from employee
的结果集
和ResultSet类的next()方法有助于将光标移动到返回结果集的下一行,在您的示例中为rs。
:)
答案 5 :(得分:0)
由于Result Set是一个接口,当您通过JDBC调用获得对ResultSet的引用时,您将获得一个实现ResultSet接口的类的实例。此类提供了所有ResultSet方法的具体实现。
接口用于将实现与接口分离。这允许创建通用算法和对象创建的抽象。例如,不同数据库的JDBC驱动程序将返回不同的ResultSet实现,但您不必更改代码以使其适用于不同的驱动程序
非常简短,如果你的ResultSet包含结果,那么使用rs.next如果你有记录集则返回true,否则返回false。
答案 6 :(得分:0)
首先,你不需要写
ResultSet rs = stmt.executeQuery(sql);
写一下
ResultSet rs = stmt.executeQuery();
上述语法用于不用于PreparedStatement的语句。
第二件事,rs.next()检查结果集是否包含任何值。它返回一个布尔值,并将光标移动到结果集中的第一个值,因为它最初位于BEFORE FIRST Position。因此,如果要访问结果集中的第一个值,则需要编写rs.next()。