为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这里需要“while (rs.next())”?

为什么这里需要“while (rs.next())”?

侃侃尔雅 2021-06-28 13:44:51
我想从我的数据库“日志”中选择最大行号并将其存储在一个变量中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() 将光标移动到下一行,但在这里,在这个结果中,我只有一行。那么,有人可以解释为什么需要循环吗?我唯一能想到的是第一个光标设置在列名上,对吗?
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

为什么?

光标最初位于第一个元素之前。您需要提前一次以访问第一个元素。

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

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


解决方案

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

rs.next();
// Access the result

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

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

所以在这种情况下代码会失败。

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

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


查看完整回答
反对 回复 2021-07-07
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

官方文档(你应该已经阅读 btw):

最初光标位于第一行之前。next 方法将光标移动到下一行,因为当 ResultSet 对象中没有更多行时它返回 false,所以可以在 while 循环中使用它来遍历结果集。

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

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


查看完整回答
反对 回复 2021-07-07
?
萧十郎

TA贡献1815条经验 获得超13个赞

您可以将其转换为使用简单if语句。


if(rs.next()) {

    // other code here

}

while当您有不止一行要带回来时,您会使用它。


查看完整回答
反对 回复 2021-07-07
  • 3 回答
  • 0 关注
  • 352 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信