代码之家  ›  专栏  ›  技术社区  ›  Nick Fortescue

如何在JDBC中从resultset中读取可能为空的双精度值?

  •  30
  • Nick Fortescue  · 技术社区  · 16 年前

    我的数据库中有一列键入了 double 我想使用JDBC结果集从中读取该值,但它可能为空。最好的方法是什么?我能想到三个选择,没有一个看起来很好。

    选项1:错误,因为异常处理冗长且有异味

    double d;
    try {
       d = rs.getDouble(1);
       // do something
    } catch(SQLException ex) {
       if(rs.wasNull()) {
          // do something else
       } else {
         throw ex;
       }
    }
    

    选项2:错误,因为有两个回迁

    s = rs.getString(1); // or getObject()
    if(s == null) {
      // do something else
    } else {
      double d = rs.getDouble(1);
      // do something
    }
    

    选项3:不好,因为Java而不是SQL转换

    s = rs.getString(1); // or getObject()
    if(s == null) {
      // do something else
    } else {
      double d = Double.parseDouble(s);
      // do something
    }
    

    有没有建议哪条路更好,或者有其他更好的路?请不要说“使用Hibernate”,我这里只限于JDBC代码。

    4 回复  |  直到 7 年前
        1
  •  47
  •   skaffman    16 年前

    选项1最近:

    double d = rs.getDouble(1);
    if (rs.wasNull()) {
      // do something
    } else {
      // use d
    }
    

    不是很好,但那是JDBC。如果列为空,则认为双精度值为“坏”,因此应使用 wasNull() 每次读取数据库中可以为空的基元时。

        2
  •  14
  •   artbristol    7 年前

    根据您的JDBC驱动程序和数据库,您可以使用装箱类型和强制转换:

    Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
    

    它将是 null 如果列是 NULL .

    如果您更改数据库,请注意检查它是否仍然有效。

        3
  •  3
  •   LaurentG    11 年前

    用途:

    rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
    
        4
  •  3
  •   George    9 年前

    或者用Java 8可以做到这一点:

    Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                    .map(BigDecimal::doubleValue).orElse(null));