我如何在JDBC中从resultSet中读取一个可能为null的double值?

Nic*_*cue 34 java double null jdbc

我的数据库中有一个类型的列,我double想使用JDBC ResultSet从中读取值,但它可能为null.这样做的最佳方式是什么?我可以想到三个选项,其中没有一个看起来非常好.

选项1:错误,因为异常处理冗长和臭

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

选项2:因为两个提取而不好

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

选项3:错误因为Java而不是SQL转换

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

有关哪条路更好的建议,还是有其他优越方式?请不要说"使用Hibernate",我只限于这里的JDBC代码.

ska*_*man 54

选项1最接近:

double d = rs.getDouble(1);
if (rs.wasNull()) {
  // do something
} else {
  // use d
}
Run Code Online (Sandbox Code Playgroud)

它不是很好,但那是JDBC.如果列为null,则double值被视为"bad",因此wasNull()每次读取数据库中可为空的基元时都应检查.

  • 请注意,从结果集中检索空基元时没有sqlexception.在这种情况下返回该原语的默认值(0表示int,0.0表示double,等等....).因此,为什么.wasNull()是必要的邪恶. (2认同)

art*_*tol 15

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

Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
Run Code Online (Sandbox Code Playgroud)

这将是null,如果柱NULL.

如果更改数据库,请小心检查这是否仍然有效.


Geo*_*rge 6

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

Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                .map(BigDecimal::doubleValue).orElse(null));
Run Code Online (Sandbox Code Playgroud)


小智 5

使用:

rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
Run Code Online (Sandbox Code Playgroud)