對象是用戶(hù)自定義的復合數據, 它封裝了數據及操作數據的方法.
Oracle中也可以自定義對象, 但本文并不重點(diǎn)討論如何在Oracle中創(chuàng )建及操作對象,
我們只關(guān)注如何通過(guò)Java來(lái)操縱Oracle中的對象.
有兩種方式可能操縱Oracle 對象:
1, 通過(guò)標準Java Struct對象;
2, 通過(guò)Oracle STRUCT對象;
我們先簡(jiǎn)單的從讀取Oracle對象入手, 初步了解一下Java是如何訪(fǎng)問(wèn)Oracle對象的.
首先在DB中CREATE一個(gè)對象DEMO_TYPE:
CREATE TYPE DEMO_TYPE AS OBJECT
(
ATOMIC_NUMBER NUMBER,
SYMBOL VARCHAR2(2),
NAME VARCHAR2(20),
MASS NUMBER(5, 2)
);
/
接著(zhù)我們創(chuàng )建一個(gè)TABLE DEMO_TABLE, 定義一個(gè)引用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:
為了能利用標準Java Struct類(lèi)操縱Oracle Object, 我們需要import java.sql.Struct這個(gè)class
現在我們讀出這個(gè)Object:
ResultSet rs = stmt.executeQuery("SELECT PERIOD, COLUMN_GROUP, ELEMENT FROM DEMO_TABLE");
前兩個(gè)Field(PERIOD 和 COLUMN_GROUP)都能用rs.getInt()方法讀取
重點(diǎn)關(guān)注一下ELEMENT這個(gè)Field, 它是對DEMO_TYPE的引用,在Java中, 我們用rs.getObject()方法記取它, 像下面這樣:
Struct eleStruct = (Struct) rs.getObject(3);
至此, Java已經(jīng)取得了Oracle Object的引用, 那么我們如何讀取Object中的每一個(gè)具體屬性呢?利用Struct class中的getAttributes()方法:
Object elementAttr[] = eleStruct.getAttributes();
把eleStruct中的每一個(gè)attribute寫(xiě)入elementAttr 數組, 現在我們就可以自由讀取 ELEMENT Field中的每一個(gè)屬性了, 如下:
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數據類(lèi)型與Java數據類(lèi)型之間的映射關(guān)系:
Oracle SQL 數據類(lèi)型 Java數據類(lèi)型
VARCHAR2, CHAR String
NUMBER BigDecimal
DATE Date
由于"SYMBOL"和"NAME" 是VARCHAR2數據類(lèi)型, 很容易轉換到String類(lèi)型, 但對于NUMBER數據, 為了能容納任何可能的NUMBER數值, 有必要先把NUMBER轉換為BigDecimal類(lèi)型, 然后轉換成其它合適的類(lèi)型.因此, 我們把元素0轉換成int類(lèi)型,把元素3轉換成float類(lèi)型, 只是為了保持與Oracle中的數據一致.
另外一個(gè)要注意的是:讀取出來(lái)的symbol和name有可能是形如"????"的亂碼, 出現這種情況, 你可能需要到OTN上下載一個(gè)nls_charset12.jar的文件,并在%CLASSPATH%中設置好其路徑.
下次, 我將講述對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();
}
}
聯(lián)系客服