热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java返回int型的空值,从JavaResu检查nullint值

从JavaResu检查nullint值在Java中,我试图从ResultSet中测试一个空值,其中列被转换为原始int类型。intiVal;Result

从Java Resu检查null int值

在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");

}

}

从上面的代码片段,有更好的方法来做到这一点,我假设第二个isNull()测试是多余的?

教育我们,谢谢

ian_scho asked 2019-03-03T17:21:58Z

9个解决方案

305 votes

当字段值为NULL时,iVal的默认值是返回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未初始化)

Richard answered 2019-03-03T17:22:23Z

72 votes

另一种方案:

public class DaoTools {

static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {

int nValue = rs.getInt(strColName);

return rs.wasNull() ? null : nValue;

}

}

Patrice IMBERT answered 2019-03-03T17:22:43Z

26 votes

我认为,这是多余的。 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

}

}

Andreas_D answered 2019-03-03T17:23:11Z

20 votes

只需检查字段是否为ResultSet#getObject()或不使用ResultSet#getObject()。用您想要的任何空值大小替换Integer。

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

或者,如果您可以保证使用正确的DB列类型,以便ResultSet#getObject()确实返回Integer(因此不是Long,Short或Byte),那么您也可以将其类型转换为Integer。

Integer foo = (Integer) resultSet.getObject("foo");

BalusC answered 2019-03-03T17:23:46Z

8 votes

你可以简单地使用AFAIK

iVal = rs.getInt("ID_PARENT");

if (rs.wasNull()) {

// do somthing interesting to handle this situation

}

即使它是NULL。

Peter Tillemans answered 2019-03-03T17:24:21Z

1 votes

为方便起见,您可以在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;

}

// ...

}

Jacob Crofts answered 2019-03-03T17:24:49Z

1 votes

只是Java Generics的更新。

您可以创建一个实用程序方法,以从先前生成的给定ResultSet中检索任何Java类型的可选值。

不幸的是,getObject(columnName,Class)不返回null,而是返回给定Java类型的默认值,因此需要2次调用

public T getOptionalValue(final ResultSet rs, final String columnName, final Class 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

}

很高兴得到反馈

luchoct answered 2019-03-03T17:25:45Z

0 votes

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

Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))

.map(BigDecimal::longValue).orElse(null));

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

George answered 2019-03-03T17:26:21Z

-5 votes

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

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

SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;

然后检查

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

{

}

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

Chris answered 2019-03-03T17:27:10Z



推荐阅读
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
author-avatar
九育
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有