从Java ResultSet中检查null int值
在Java中,我试图从ResultSet中testing一个null值,其中列被转换为原始inttypes。
int iVal; ResultSet rs = magicallyAppearingStmt.executeQuery(query); if (rs.next()) { if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) { iVal = rs.getInt("ID_PARENT"); } }
从上面的代码片段,有没有更好的方式来做到这一点,我假设第二个是NULL()testing是多余的?
教育我们,谢谢
当字段值为NULL
时, ResultSet.getInt
的默认值是返回0
,这也是iVal
声明的默认值。 在这种情况下,你的testing是完全多余的。
如果你真的想要做一些不同的事情,如果字段值为NULL,我build议:
int iVal = 0; ResultSet rs = magicallyAppearingStmt.executeQuery(query); if (rs.next()) { iVal = rs.getInt("ID_PARENT"); if (rs.wasNull()) { // handle NULL field value } }
(在下面编辑@马丁评论;由于写入的OP代码不会被编译,因为iVal
没有被初始化)
另一个scheme
public class DaoTools { static public Integer getInteger(ResultSet rs, String strColName) throws SQLException { int nValue = rs.getInt(strColName); return rs.wasNull() ? null : nValue; } }
我认为,这是多余的。 如果列值实际为NULL
,则rs.getObject("ID_PARENT")
应该返回一个Integer
对象或null
。 所以,甚至有可能做到这样的事情:
if (rs.next()) { Integer idParent = (Integer) rs.getObject("ID_PARENT"); if (idParent != null) { iVal = idParent; // works for Java 1.5+ } else { // handle this case } }
只要使用ResultSet#getObject()
检查字段是否为null
。 用所需的任何空值replace-1
。
int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;
或者,如果您可以保证使用正确的数据库列types,以便ResultSet#getObject()
真正返回一个Integer
(因此不是Long
, Short
或Byte
),那么您也可以将它转换为Integer
types。
Integer foo = (Integer) resultSet.getObject("foo");
AFAIK你可以简单地使用
iVal = rs.getInt("ID_PARENT"); if (rs.wasNull()) { // do somthing interesting to handle this situation }
即使它是NULL。
为方便起见,您可以在ResultSet周围创build一个包装类,当ResultSet
通常不会返回空值。
public final class ResultSetWrapper { private final ResultSet rs; public ResultSetWrapper(ResultSet rs) { this.rs = rs; } public ResultSet getResultSet() { return rs; } public Boolean getBoolean(String label) throws SQLException { final boolean b = rs.getBoolean(label); if (rs.wasNull()) { return null; } return b; } public Byte getByte(String label) throws SQLException { final byte b = rs.getByte(label); if (rs.wasNull()) { return null; } return b; } // ... }
只是Javagenerics的更新。
您可以创build一个实用程序方法,从以前stream行的给定ResultSet中检索任何Javatypes的可选值。
不幸的是,getObject(columnName,Class)不会返回null,而是给定Javatypes的默认值,所以需要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 }
很高兴得到反馈
用java 8你可以这样做:
Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name")) .map(BigDecimal::longValue).orElse(null));
在这种情况下,如果SQL值为NULL,则确保nVal将为空(而非零)
另一个很好的检查方法,如果你有控制SQL的话,就是在查询本身的int列中添加一个默认值。 然后检查这个值。
例如,对于Oracle数据库,请使用NVL
SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;
然后检查
if (rs.getInt('ID_PARENT') != -999) { }
当然,这也是在这样的假设下,有一个通常在列中找不到的价值。