我在我的数据库,它的类型double一列,我想读使用JDBC结果从它的价值,但它可以为null。什么是这样做的最佳方式?我能想到的三个选项中没有一个看起来很不错的。

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

任何建议在其上的方法是较好的,或者是有另一种优越的方法?请不要说“使用休眠”,我仅限于JDBC代码只有在这里。

有帮助吗?

解决方案

选择1是最接近:

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

这是不是很漂亮,但是这是JDBC。如果列是空,双值被认为是“坏”的,所以你应该检查使用wasNull()每次读取原始是在数据库为空。

其他提示

根据您的JDBC驱动程序和数据库,您可以使用盒装型和投:

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

如果将柱null应当NULL

注意检查如果更改数据库仍然工作。

使用:

rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()

或者与Java 8,你可以这样做:

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

科特林版本来检索可为空的字段:

val parentId = resultSet.getObject("parent_id") as Double?
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top