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

2022-09-01 03:31:45

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

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

选项 1 最接近:

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

这不是很好,但那是JDBC。如果该列为 null,则双精度值被视为“坏”,因此每次读取数据库中可为 null 的基元时,都应使用 进行检查。wasNull()


答案 2

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

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

如果该列是 .nullNULL

如果更改数据库,请仔细检查这是否仍然有效。