(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 nullcol_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.的异常:
...
0001-01-01 00:00:00.0
当配置为converToNull时,输出变为:
col_int is null
col_bigint is null
null
null
程序不再抛出异常,而是将该无效的值转换为null。