为什么“while (rs.next())”在这里是必要的?

2022-09-01 02:15:31

我想从数据库“Logs”中选择最大行号并将其存储在变量中。m

这是我的代码:

ResultSet rs = stmt.executeQuery("Select max(Line) as L from logs");

while (rs.next()) {          // Why do I need this
    int m = rs.getInt("L");
    System.out.println(m);
}

但是除非我使用.否则它不起作用。while(rs.next())


如果我理解正确,)将游标移动到下一行,但在这里,在这个结果中,我只有一行rs.next(

那么,有人可以解释为什么循环是必要的吗?我唯一能想到的是,第一个光标设置在列名上,我是对的吗?


答案 1

为什么?

游标最初放置在第一个元素之前。您需要推进一次才能访问第一个元素。

这显然是因为如您所见,使用循环遍历结果非常方便。来自官方文档

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


溶液

因此,虽然您不需要任何循环,但您需要前进光标一次。从技术上讲,一个就足够了:rs.next();

rs.next();
// Access the result

但是,您可能需要考虑根本没有匹配的情况,因为:

当对该方法的调用返回时,游标位于最后一行之后。任何需要当前行的方法调用都将导致抛出。nextfalseResultSetSQLException

因此,在这种情况下,代码将失败。

因此,您应该考虑这种情况,并使用返回的来保护您的访问:boolean

if (rs.next()) {
    // Access result ...
} else {
    // No match ...
}

答案 2

官方文档(顺便说一句,你应该已经阅读了):

最初,游标位于第一行之前。下一个方法将游标移动到下一行,并且由于当 ResultSet 对象中没有更多行时,它将返回 false,因此可以在 while 循环中使用它来循环访问结果集。

你基本上需要移动它,在你的情况下移动它一次就足够了:

 rs.next(); 
 System.out.println(rs.getInt("L")); 

推荐