在Java中,我试图从ResultSet测试空值,其中列被转换为原始int类型。
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
从上面的代码片段中,是否有更好的方法来做到这一点,并且我假设第二个wasNull()测试是多余的?
教育我们,谢谢
只是Java泛型的更新。
您可以创建一个实用程序方法,从给定的ResultSet(先前强制转换的结果集)检索任意Java类型的可选值。
不幸的是,getObject(columnName, Class)不返回null,而是给定Java类型的默认值,因此需要2次调用
public <T> T getOptionalValue(final ResultSet rs, final String columnName, final Class<T> clazz) throws SQLException {
final T value = rs.getObject(columnName, clazz);
return rs.wasNull() ? null : value;
}
在这个例子中,你的代码如下所示:
final Integer columnValue = getOptionalValue(rs, Integer.class);
if (columnValue == null) {
//null handling
} else {
//use int value of columnValue with autoboxing
}
乐于得到反馈
在Kotlin中,我只会解决它一次,并永远解决这个问题:
fun <K : Any> ResultSet.getNullable(columnLabel: String, type: KClass<K>): K? =
this.getObject(columnLabel, type.java)
之后你可以这样做:
rs.getNullable("ID_PARENT", Int::class)
我想如果你愿意,你也可以这样做
fun <K> ResultSet.getNullable(columnLabel: String, type: Class<K>): K? =
this.getObject(columnLabel, type)
所以你可以这样做:
rs.getNullable("ID_PARENT", Int::class.java)
如果你遇到的开发人员连最简单的事情都不能达成一致,最好还是同时提供两种方法。
fun <K : Any> ResultSet.getNullable(columnLabel: String, type: KClass<K>): K? =
this.getNullable(columnLabel, type.java)
fun <K> ResultSet.getNullable(columnLabel: String, type: Class<K>): K? =
this.getObject(columnLabel, type)
编辑:如果库仍然是挑剔的,你终于可以这样做:
rs.getNullable("ID_PARENT", String::class)?.let {FOO.valueOf(it) }