【问题标题】:Java JDBC: Do I need to loop ResultSet when query returns single row?Java JDBC:查询返回单行时是否需要循环 ResultSet?
【发布时间】:2018-04-06 10:29:00
【问题描述】:

我的 sql 查询只返回一行。查询时,我需要遵循通常的while(rs.next) {...} 模式还是可以这样做:

...
rs.next();
int id  = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
...

代替:

...
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");
      }
...

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    不,您不必每次都循环,因为rs.next() 的调用已经将指针从null 设置到第一个可用行并返回是否有条目。

    检查是否返回了某些东西仍然有意义:

    if(rs.next())
    {
        // process resultset
    }else
    {
        // do something when no data arrived
    }
    

    【讨论】:

    • 尽管在else 块中处理“未找到”的情况,但像if(rs.next) 一样使用它可能仍然是一个好主意
    • @Selim 是的,你是对的,如果没有条目,NullPointerException 将被抛出。
    • 当我期望正好有一行时,我会在获取值后添加另一个检查 rs.next。如果它返回 true,我会抛出一个异常,因为这意味着查询返回了多行,而我不知道我有哪一行。当插入错误数据、数据模型更改或 SQL 被错误地转录为 Java 时,可能会发生这种情况。像这样的检查也与您想要任何行的情况区分开来。在实践中,我实际上为此使用了 Spring 的 JdbcTemplate 类。它提供了几个自动提供这种行为的 queryForObject 方法。
    • @mymarkers 你是对的,如果你想要确切一行,你必须再次调用并检查rs.next()。但是 OP 询问他是否可以省略 while 循环,而不是如何检查查询是否 only 返回一行。 :)
    【解决方案2】:

    如果您只对第一个结果感兴趣(或只有一个结果),则可以避免使用循环。如果您确保得到一些结果,这也是一个很好的做法:

    ...
    if (rs.next()) {
        int id  = rs.getInt("id");
        int age = rs.getInt("age");
        String first = rs.getString("first");
        String last = rs.getString("last");
    }
    ...
    

    无论如何,不​​要忘记关闭不再使用的资源(ResultSet、Statement、Connection...)

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2017-03-25
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多