天天看點

徐海蛟:Java null和資料庫NULL的認識

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

}

}