从Java ResultSet检查null int值

时间:2010-05-27 10:42:19

标签: java null resultset

在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()测试是多余的吗?

教育我们,谢谢

11 个答案:

答案 0 :(得分:331)

字段值为ResultSet.getInt时,NULL的默认值是返回0,这也是iVal声明的默认值。在这种情况下,您的测试完全是多余的。

如果你真的想在字段值为NULL时做一些不同的事情,我建议:

int iVal = 0;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
    iVal = rs.getInt("ID_PARENT");
    if (rs.wasNull()) {
        // handle NULL field value
    }
}

(编辑为以下@martin评论;编写的OP代码无法编译,因为iVal未初始化)

答案 1 :(得分:75)

另一种解决方案:

public class DaoTools {
    static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
        int nValue = rs.getInt(strColName);
        return rs.wasNull() ? null : nValue;
    }
}

答案 2 :(得分:28)

我认为,这是多余的。如果列值实际为rs.getObject("ID_PARENT"),则Integer应返回null个对象或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
  }      
}

答案 3 :(得分:22)

使用ResultSet#getObject()检查字段是否为null。用您想要的任何空值大小替换-1

int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;

或者,如果您可以保证使用正确的数据库列类型,以便ResultSet#getObject()确实返回Integer(因此不是LongShort或{{ 1}}),然后你也可以将它强制转换为Byte

Integer

答案 4 :(得分:9)

AFAIK你可以简单地使用

iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
  // do somthing interesting to handle this situation
}

即使它是NULL。

答案 5 :(得分:4)

使用Java Generics进行更新。

您可以创建一个实用程序方法,以从先前投放的给定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
}

很高兴获得反馈

答案 6 :(得分:1)

为方便起见,您可以在ResultSet周围创建一个包装类,当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;
    }

    // ...

}

答案 7 :(得分:0)

使用java 8,您可以这样做:

Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                    .map(BigDecimal::longValue).orElse(null));

在这种情况下,如果SQL值为NULL,则确保nVal为空(而不是零)

答案 8 :(得分:0)

您可以使用resultSet和具有Number类型的列名称来调用此方法。它将返回Integer值,或者返回null。数据库中的空值将不会返回零

public int GetCPUUsage()
{
    var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", Environment.MachineName);
    cpuCounter.NextValue();
    System.Threading.Thread.Sleep(1000);
    return (int)cpuCounter.NextValue();
}

答案 9 :(得分:0)

以防万一有人在使用 Kotlin 编程时来到这里(就像我所做的那样),BalusC 建议的答案可以正常工作。请注意,ShortFloatInteger 中分别实例化为 DoubleResultSet,我们应该在调用后将它们转换为正确的类型getObject()。就我而言,最终代码是:

when {
    propKClass.isSubclassOf(Int::class) -> rs.getObject(colName) as Int? 
    propKClass.isSubclassOf(Short::class) -> (rs.getObject(colName) as Int?)?.toShort()
    propKClass.isSubclassOf(Long::class) -> rs.getObject(colName) as Long?
    propKClass.isSubclassOf(Boolean::class) -> rs.getObject(colName) as Boolean?
    propKClass.isSubclassOf(Double::class) -> rs.getObject(colName) as Double?
    propKClass.isSubclassOf(Float::class) -> (rs.getObject(colName) as Double?)?.toFloat()
    else -> rs.getString(colName)
}

答案 10 :(得分:-6)

另一种检查SQL的好方法是在查询本身中为int列添加一个默认值。然后检查该值。

例如对于Oracle数据库,请使用NVL

SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;

然后检查

if (rs.getInt('ID_PARENT') != -999)
{
}

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