Java null和数据库NULL的认识
徐海蛟老师课堂教学.
Java是面向对象的高级语言。Java中,null表示类或对象的变量是空,不代表任何对象或实例,可以将null赋给引用类型变量,但不可以将null赋给基本类型变量;任何对象在没有进行初始化时,它默认的值都是null。没有实体的对象称为空对象;空对象不能使用,即不能让一个空对象去调用方法产生行为;大名鼎鼎的NullPointerException就是因为应用程序试图在需要对象的地方使用null时抛出来的。例如下面这样的使用便会抛出NullPointerException异常:
String str = null;
System.out.println(str.toString());
有许多问题的答案我们并不知晓,我们被巨大的未知领域包围着。在数据库中“未知的”这个概念用NULL表示;NULL在数据库表示未知。NULL不等于零或空格。NULL 值不视作大于、小于或等于任何其它值。当一个变量、列或常量具有NULL值时,它的值是未知的、不确定的。“未知的”与空白或零或布尔值FALSE完全不同。“未知的”意味着该变量根本没有值,因此不能与其他变量直接进行比较。
NULL值具有以下三个规则:
(1)一个NULL不与其他任何值相等;一个NULL不与其他任何值不等;
(2)在对一个NULL值应用函数时,一般都会得到一个NULL值作为结果。
(3)一般而言,只要执行涉及一个或多个NULL值的比较操作,那个比较的结果也是NULL值,它不同于TRUE或FALSE,因而这样的比较除了失败,没有任何帮助作用。
在数据库中我们可以通过特定的关键字得到NULL。
例如:有如下结构的员工表emp。
-- Oracle 员工表
CREATE TABLE emp(
empno number(10) PRIMARY KEY,
ename varchar2(20),
job varchar2(9) NOT NULL,
mgr number(4) NOT NULL,
hiredate date NOT NULL,
sal number(7,2) NOT NULL,
comm number(7,2), -- 业绩提成可为 NULL
deptno number(10)
);
其中业绩提成字段 comm 列可以为NULL。可以使用IS NULL或IS NOT NULL关键字。
SELECT * FROM emp WHERE comm IS NOT NULL;
SELECT * FROM emp WHERE comm IS NULL;
和Java不同的是数据库中可以将NULL赋给任何数据类型。这样一来,我们从数据库中读取字段的值后,在Java程序中如何判断读取的值是否为null呢?用name==null吗?显然不行,==是判断两个变量或实例是不是指向同一个内存空间,除非这个name是String类型的。
而equals()方法呢?是判断两个变量或实例所指向的内存空间的值是不是相同。
Java.sql.ResultSet接口中的boolean wasNull()方法可以解决这个问题。
boolean wasNull():报告最后一个读取的列是否具有值 SQL NULL。注意,必须首先对列调用一个获取方法尝试读取其值,然后调用wasNull()方法查看读取的值是否为 SQL NULL。如果发生数据库访问错误将抛出SQLException。
如下是Java示例代码:
String value = "";
float comm;
while (rs.next()) {
value = rs.getString("ename");
if (rs.wasNull()) {
System.out.println("ename = NULL");
} else {
System.out.println(value);}
comm = rs.getFloat("comm");
if (rs.wasNull()) {
System.out.println("comm = NULL");
} else {
System.out.println(comm);
}
}
徐海蛟老师课堂教学.
Java是面向对象的高级语言。Java中,null表示类或对象的变量是空,不代表任何对象或实例,可以将null赋给引用类型变量,但不可以将null赋给基本类型变量;任何对象在没有进行初始化时,它默认的值都是null。没有实体的对象称为空对象;空对象不能使用,即不能让一个空对象去调用方法产生行为;大名鼎鼎的NullPointerException就是因为应用程序试图在需要对象的地方使用null时抛出来的。例如下面这样的使用便会抛出NullPointerException异常:
String str = null;
System.out.println(str.toString());
有许多问题的答案我们并不知晓,我们被巨大的未知领域包围着。在数据库中“未知的”这个概念用NULL表示;NULL在数据库表示未知。NULL不等于零或空格。NULL 值不视作大于、小于或等于任何其它值。当一个变量、列或常量具有NULL值时,它的值是未知的、不确定的。“未知的”与空白或零或布尔值FALSE完全不同。“未知的”意味着该变量根本没有值,因此不能与其他变量直接进行比较。
NULL值具有以下三个规则:
(1)一个NULL不与其他任何值相等;一个NULL不与其他任何值不等;
(2)在对一个NULL值应用函数时,一般都会得到一个NULL值作为结果。
(3)一般而言,只要执行涉及一个或多个NULL值的比较操作,那个比较的结果也是NULL值,它不同于TRUE或FALSE,因而这样的比较除了失败,没有任何帮助作用。
在数据库中我们可以通过特定的关键字得到NULL。
例如:有如下结构的员工表emp。
-- Oracle 员工表
CREATE TABLE emp(
empno number(10) PRIMARY KEY,
ename varchar2(20),
job varchar2(9) NOT NULL,
mgr number(4) NOT NULL,
hiredate date NOT NULL,
sal number(7,2) NOT NULL,
comm number(7,2), -- 业绩提成可为 NULL
deptno number(10)
);
其中业绩提成字段 comm 列可以为NULL。可以使用IS NULL或IS NOT NULL关键字。
SELECT * FROM emp WHERE comm IS NOT NULL;
SELECT * FROM emp WHERE comm IS NULL;
和Java不同的是数据库中可以将NULL赋给任何数据类型。这样一来,我们从数据库中读取字段的值后,在Java程序中如何判断读取的值是否为null呢?用name==null吗?显然不行,==是判断两个变量或实例是不是指向同一个内存空间,除非这个name是String类型的。
而equals()方法呢?是判断两个变量或实例所指向的内存空间的值是不是相同。
Java.sql.ResultSet接口中的boolean wasNull()方法可以解决这个问题。
boolean wasNull():报告最后一个读取的列是否具有值 SQL NULL。注意,必须首先对列调用一个获取方法尝试读取其值,然后调用wasNull()方法查看读取的值是否为 SQL NULL。如果发生数据库访问错误将抛出SQLException。
如下是Java示例代码:
String value = "";
float comm;
while (rs.next()) {
value = rs.getString("ename");
if (rs.wasNull()) {
System.out.println("ename = NULL");
} else {
System.out.println(value);}
comm = rs.getFloat("comm");
if (rs.wasNull()) {
System.out.println("comm = NULL");
} else {
System.out.println(comm);
}
}