對象是用戶自定義的復(fù)合數(shù)據(jù), 它封裝了數(shù)據(jù)及操作數(shù)據(jù)的方法.
Oracle中也可以自定義對象, 但本文并不重點(diǎn)討論如何在Oracle中創(chuàng)建及操作對象,
我們只關(guān)注如何通過Java來操縱Oracle中的對象.
有兩種方式可能操縱Oracle 對象:
1, 通過標(biāo)準(zhǔn)Java Struct對象;
2, 通過Oracle STRUCT對象;
我們先簡單的從讀取Oracle對象入手, 初步了解一下Java是如何訪問Oracle對象的.
首先在DB中CREATE一個對象DEMO_TYPE:
CREATE TYPE DEMO_TYPE AS OBJECT
(
ATOMIC_NUMBER NUMBER,
SYMBOL VARCHAR2(2),
NAME VARCHAR2(20),
MASS NUMBER(5, 2)
);
/
接著我們創(chuàng)建一個TABLE DEMO_TABLE, 定義一個引用DEMO_TYPE的字段:
CREATE TABLE DEMO_TABLE
(
PERIOD NUMBER,
COLUMN_GROUP NUMBER,
ELEMENT DEMO_TYPE
);
INSERT INTO DEMO_TABLE
VALUES(1, 1, DEMO_TYPE(1, ‘H‘, ‘Hydrogen‘, 0.5));
INSERT INTO DEMO_TABLE
VALUES(1, 8, DEMO_TYPE(2, ‘He‘, ‘Helium‘, 5.89));
INSERT INTO DEMO_TABLE
VALUES(2, 1, DEMO_TYPE(3, ‘Li‘, ‘Lithium‘, 6.3));
下面看看Java Codes:
為了能利用標(biāo)準(zhǔn)Java Struct類操縱Oracle Object, 我們需要import java.sql.Struct這個class
現(xiàn)在我們讀出這個Object:
ResultSet rs = stmt.executeQuery("SELECT PERIOD, COLUMN_GROUP, ELEMENT FROM DEMO_TABLE");
前兩個Field(PERIOD 和 COLUMN_GROUP)都能用rs.getInt()方法讀取
重點(diǎn)關(guān)注一下ELEMENT這個Field, 它是對DEMO_TYPE的引用,在Java中, 我們用rs.getObject()方法記取它, 像下面這樣:
Struct eleStruct = (Struct) rs.getObject(3);
至此, Java已經(jīng)取得了Oracle Object的引用, 那么我們?nèi)绾巫x取Object中的每一個具體屬性呢?利用Struct class中的getAttributes()方法:
Object elementAttr[] = eleStruct.getAttributes();
把eleStruct中的每一個attribute寫入elementAttr 數(shù)組, 現(xiàn)在我們就可以自由讀取 ELEMENT Field中的每一個屬性了, 如下:
int atomic_number = ((BigDecimal)elementAttr[0]).intValue();
String symbol = (String) elementAttr[1];
String name = (String) elementAttr[2];
float mass = ((BigDecimal) elementAttr[3]).floatValue();
注意對元素0和元素3的讀取方法.
先看看基本SQL數(shù)據(jù)類型與Java數(shù)據(jù)類型之間的映射關(guān)系:
Oracle SQL 數(shù)據(jù)類型 Java數(shù)據(jù)類型
VARCHAR2, CHAR String
NUMBER BigDecimal
DATE Date
由于"SYMBOL"和"NAME" 是VARCHAR2數(shù)據(jù)類型, 很容易轉(zhuǎn)換到String類型, 但對于NUMBER數(shù)據(jù), 為了能容納任何可能的NUMBER數(shù)值, 有必要先把NUMBER轉(zhuǎn)換為BigDecimal類型, 然后轉(zhuǎn)換成其它合適的類型.因此, 我們把元素0轉(zhuǎn)換成int類型,把元素3轉(zhuǎn)換成float類型, 只是為了保持與Oracle中的數(shù)據(jù)一致.
另外一個要注意的是:讀取出來的symbol和name有可能是形如"????"的亂碼, 出現(xiàn)這種情況, 你可能需要到OTN上下載一個nls_charset12.jar的文件,并在%CLASSPATH%中設(shè)置好其路徑.
下次, 我將講述對Oracle Object的更新.
附完整代碼如下:
import java.sql.*;
import java.math.BigDecimal;
public class testLob
{
public static void main(String args[]) throws SQLException
{
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:OEMREP", "scott", "tiger");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT PERIOD, COLUMN_GROUP, ELEMENT FROM DEMO_TABLE");
while (rs.next()) {
int period = rs.getInt(1);
int group = rs.getInt(2);
Struct eleStruct = (Struct) rs.getObject(3);
Object elementAttr[] = eleStruct.getAttributes();
int atomic_number = ((BigDecimal)elementAttr[0]).intValue();
String symbol = (String) elementAttr[1];
String name = (String) elementAttr[2];
float mass = ((BigDecimal) elementAttr[3]).floatValue();
System.out.println("atomic_number = " + atomic_number +
"\tsymbol = " + symbol +
"\tname = " + name +
"\tmass = " + mass);
}
rs.close();
stmt.close();
conn.close();
}
}