39

我的数据库中有一个已键入的列,double我想使用 JDBC ResultSet 从中读取值,但它可能为空。这样做的最佳方法是什么?我能想到三个选项,但都不是很好。

选项 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

5 回答 5

60

选项 1 最接近:

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

这不是很好,但那是 JDBC。如果该列为空,则双精度值被认为是“坏的”,因此您应该wasNull()在每次读取数据库中可为空的原语时检查 using。

于 2009-07-09T12:17:06.653 回答
19

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

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

如果null该列是NULL.

如果您更改数据库,请小心检查这仍然有效。

于 2012-12-12T13:40:43.417 回答
9

采用:

rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
于 2014-03-02T17:01:26.550 回答
7

或者使用 java 8 你可以这样做:

Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                .map(BigDecimal::doubleValue).orElse(null));
于 2016-07-07T11:35:59.197 回答
0

Kotlin 版本检索可空字段:

val parentId = resultSet.getObject("parent_id") as Double?
于 2019-04-30T04:45:20.690 回答