我如何在JDBC读取ResultSet中创建可能空双重价值?
题
我在我的数据库,它的类型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?
不隶属于 StackOverflow