从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 (因此不是LongShortByte ),那么您也可以将它转换为Integertypes。

 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) { } 

当然,这也是在这样的假设下,有一个通常在列中找不到的价值。