【问题标题】:How do I in JDBC read a possibly null double value from resultSet?如何在 JDBC 中从 resultSet 读取可能为空的双精度值?
【发布时间】:2010-11-09 08:40:54
【问题描述】:

我的数据库中有一个输入为 double 的列,我想使用 JDBC ResultSet 从中读取值,但它可能为空。这样做的最佳方法是什么?我能想到三个选项,似乎都不是很好。

选项 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
}

关于哪种方式更好的任何建议,或者还有其他更好的方式吗?并且请不要说“使用 Hibernate”,我这里只限于 JDBC 代码。

【问题讨论】:

    标签: java jdbc null double


    【解决方案1】:

    选项 1 最接近:

    double d = rs.getDouble(1);
    if (rs.wasNull()) {
      // do something
    } else {
      // use d
    }
    

    这不是很好,但那是 JDBC。如果该列为空,则双精度值被认为是“坏的”,因此您应该在每次读取数据库中可为空的原语时使用wasNull() 进行检查。

    【讨论】:

    • 请注意,从结果集中检索空原语时没有 sqlexception。在这种情况下返回该原语的默认值(0 表示 int,0.0 表示双精度,等等......)。因此,为什么 .wasNull() 是必要的邪恶。
    • 当我意识到 vanilla JDBC 如何处理空值时,我的反应与@JosefPfleger 完全相同。但是,如果您想继续使用纯 SQL(而不是采用 ORM)并完全避免这种崩溃,我建议使用 Spring 的 JdbcTemplate,它会为您处理所有那些讨厌的 null 检查。
    【解决方案2】:

    根据您的 JDBC 驱动程序和数据库,您可以使用盒装类型和强制转换:

    Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
    

    如果列是NULL,它将是null

    如果您更改数据库,请仔细检查这是否仍然有效。

    【讨论】:

    • 在使用 oracle 语法查询 HSQLDB 进行测试时,这对我不起作用。
    • 这对我来说对 MySQL 来说效果很好,而且比 .wasNull() 更好看
    【解决方案3】:

    用途:

    rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
    

    【讨论】:

      【解决方案4】:

      或者使用 java 8 你可以这样做:

      Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                      .map(BigDecimal::doubleValue).orElse(null));
      

      【讨论】:

        【解决方案5】:

        Kotlin 版本检索可空字段:

        val parentId = resultSet.getObject("parent_id") as Double?
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 1970-01-01
          • 2015-06-15
          • 2011-02-06
          相关资源
          最近更新 更多