JDBC中对数据库中Null字段和Timestamp字段的处理总结

(1)假设使用如下DDL在MySQL数据库中创建一个名为type_test的数据库表:

CREATE TABLE `type_test` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,

  `col_int` int(11) DEFAULT NULL,

  `col_bigint` bigint(20) DEFAULT NULL,

  `col_varchar` varchar(64) DEFAULT NULL,

  `col_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

并存入如下的值:


编写如下测试代码:

...

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

try {

    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "mysql");

    if (conn != null) {

        String sql = "select col_int, col_bigint, col_varchar, col_timestamp from type_test where id=1";

        stmt = conn.createStatement();

        rs = stmt.executeQuery(sql);

        rs.next();

        System.out.println(rs.getInt(1));

        System.out.println(rs.getLong(2));

        System.out.println(rs.getString(3));

        System.out.println(rs.getTimestamp(4));

    }

} catch (SQLException ex) {

    ex.printStackTrace();

} finally {

    try {

        if (rs != null) {

            rs.close();

        }

        if (stmt != null) {

            stmt.close();

        }

        if (conn != null) {

            conn.close();

        }

    } catch (SQLException ex) {

        ex.printStackTrace();

    }

}

...

执行程序,将会输出怎样的值呢?通过测试可以知道,输出的值如下:

0

0

null

null

可知,在调用ResultSet上的getInt()和getLong()时,如果数据库中对应的列的值为Null,那么返回值便是0。同时,通过查看Java API文档也可以加以证实:... if the value is SQL NULL, the value returned is 0。

如果数据库中具有如下的值:


那么程序的输出结果又将是什么呢?通过测试可以知道,输出的值依然是:
0
0
null
null
那么,如何区分这两种情况呢?幸运的是ResultSet中提供了一个wasNull()方法,用于判断最后读取的那一列是否具有SQL NULL值。

按照如下方式改动程序的输出语句:

...

int colInt = rs.getInt(1);

if (rs.wasNull()) {

    System.out.println("col_int is null");

} else {

    System.out.println(colInt);

}

long colBigint = rs.getLong(2);

if (rs.wasNull()) {

    System.out.println("col_bigint is null");

} else {

    System.out.println(colBigint);

}

System.out.println(rs.getString(3));

System.out.println(rs.getTimestamp(4));

...

在数据库表各列的值为Null时,输出为:

col_int is null
col_bigint is null
null

null

这样,我们便可以得知数据库中的指定字段是否为SQL Null,而非自动转换后的值。

(2)假设数据库中具有如下的值:


那么程序的运行结果又会是什么呢?通过测试可以知道,程序并没有顺利执行,而是抛出了诸如java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 4 to TIMESTAMP.的异常:


0000-00-00 00:00:00对于Timestamp来说并不是有效值。那么如何处理这种情况呢?一种可行的方式是配置JDBC连接串中的zeroDateTimeBehavior属性,该属性可选的值为:(1)exception(2)round(3)convertToNull这三种。当配置为exception时会依然抛出如上的异常,而当配置为round时,输出为:
...
0001-01-01 00:00:00.0
当配置为converToNull时,输出变为:
col_int is null
col_bigint is null
null
null
程序不再抛出异常,而是将该无效的值转换为null。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值