处理数据库Null值

数据库表的列可以定义为NULL或NOT NULL。NULL表示列可以存储NULL值;NOT NULL表示列不可以包含NULL值。NULL值表示值是未知的。当在数据库中创建表时,如果没有指定列是NULL还是NOT NULL,数据库默认为NULL。

Java对象类型,比如String,可用于存储数据库NULL值。当一个查询将包含NULL值的列检索存储到Java String时,String就会包含Java null值。例如,顾客 #5的phone列(定义为VARCHAR2)为NULL,下面的语句使用getString()方法将该值读取到String类型的phone中:

phone = customerResultSet.getString("phone");

运行该语句之后,phone Java String就包含了Java null值。

NULL值存储在Java对象中是非常合适的,但对于Java数字、逻辑和位类型类型呢?如果将NULL值检索存储到Java数据、逻辑或位变量中,例如int、float、boolean或byte,则变量将包含值零。对于数据库,零和NULL是不同的值:零是一个确定的值,NULL表示值未知。这就导致了一个问题,在Java程序中如何区分零和NULL。

有两种方法可以解决这个问题:

 1,使用ResultSet中的wasNull()方法。当从数据库中检索到的值是NULL时,wasNull()方法返回true;否则,返回false。

 2,可以使用Java包装类。包装类是一个Java类,允许定义包装对象,包装对象可用于存储数据库返回的列值。包装对象将数据库NULL值存储为Java null值,将非NULL值存储为正常值。

Long user_id = rs.getLong("user_id");//user_id为空时,Long这个包装类将user_id置为0.
String nickname = null;
String phone = null;
if(user_id!=0){
UserDaoImpl userDaoImpl = new UserDaoImpl();
User user = userDaoImpl.findUserByid(user_id);

nickname = user.getNickname();
phone = user.getPhone();
}

下例显示第一个方法的用法,使用了products表的产品#12。该行的product_type_id列为NULL值,而且该列定义为数据库INTEGER。并假设ResultSet对象productResultSet已经用products表的产品#12的product_id和product_type_id列填充。下例使用wasNull()方法检查读取的product_type_id列值是否为NULL:

System.out.println("product_type_id = " +
productResultSet.getInt("product_type_id"));
if (productResultSet.wasNull()) {
System.out.println("Last value read was NULL");
}

因为product_type_id列包含NULL值,wasNull()返回true,所以会显示字符串Last value read was NULL。

第二种方法使用Java包装类,在看第二种方法的例子之前,需要解释包装类到底是什么。包装类定义在java.lang包中,下面的7个包装类就定义在该包中:

● java.lang.Short

● java.lang.Integer

● java.lang.Long

● java.lang.Float

● java.lang.Double

● java.lang.Boolean

● java.lang.Byte

使用这些包装类声明的对象可用于表示各种类型数字和Boolean类型的数据库NULL值。当数据库NULL被检索到这样一个对象时,它就会包含Java null值。下例声明了一个java.lang.Integer,名为productTypeId:

java.lang.Integer productTypeId

然后,可以调用getObject()方法,将数据库NULL存储到productTypeId中,如下所示:

productTypeId =
(java.lang.Integer) productResultSet.getObject("product_type_id");

getObject()方法返回java.lang.Object类的一个实例,必须强制转换为合适的类型,本例中,转换为java.lang.Integer。假定此例从productResultSet中读取和上一个例子相同的行,getObject()会返回Java null值,而且该值会被复制到productTypeId中。当然,如果从数据库检索到的值不是NULL,productTypeId就会包含该值。例如,如果从数据库检索到的值是1,productTypeId就会包含值1。

也可以在JDBC语句中使用包装类对象,该语句执行INSERT或UPDATE,将列设置为正常值或NULL值。如果想要使用包装类对象将列值设置为NULL,就要将包装类对象设置为null,并在INSERT或UPDATE语句中使用它将数据库列设置为NULL。下例使用被设置为null的java.lang.Double对象,将产品#12的price列设置为NULL:

java.lang.Double price = null;
myStatement.executeUpdate(
"UPDATE products " +
"SET price = " + price + " " +
"WHERE product_id = 12"
);