对象是用户自定义的复合数据, 它封装了数据及操作数据的方法.
Oracle中也可以自定义对象, 但本文并不重点讨论如何在Oracle中创建及操作对象,
我们只关注如何通过Java来操纵Oracle中的对象.
有两种方式可能操纵Oracle 对象:
1, 通过标准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)
);
/
接着我们创建一个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:
为了能利用标准Java Struct类操纵Oracle Object, 我们需要import java.sql.Struct这个class
现在我们读出这个Object:
ResultSet rs = stmt.executeQuery("SELECT PERIOD, COLUMN_GROUP, ELEMENT FROM DEMO_TABLE");
前两个Field(PERIOD 和 COLUMN_GROUP)都能用rs.getInt()方法读取
重点关注一下ELEMENT这个Field, 它是对DEMO_TYPE的引用,在Java中, 我们用rs.getObject()方法记取它, 像下面这样:
Struct eleStruct = (Struct) rs.getObject(3);
至此, Java已经取得了Oracle Object的引用, 那么我们如何读取Object中的每一个具体属性呢?利用Struct class中的getAttributes()方法:
Object elementAttr[] = eleStruct.getAttributes();
把eleStruct中的每一个attribute写入elementAttr 数组, 现在我们就可以自由读取 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数据类型与Java数据类型之间的映射关系:
Oracle SQL 数据类型 Java数据类型
VARCHAR2, CHAR String
NUMBER BigDecimal
DATE Date
由于"SYMBOL"和"NAME" 是VARCHAR2数据类型, 很容易转换到String类型, 但对于NUMBER数据, 为了能容纳任何可能的NUMBER数值, 有必要先把NUMBER转换为BigDecimal类型, 然后转换成其它合适的类型.因此, 我们把元素0转换成int类型,把元素3转换成float类型, 只是为了保持与Oracle中的数据一致.
另外一个要注意的是:读取出来的symbol和name有可能是形如"????"的乱码, 出现这种情况, 你可能需要到OTN上下载一个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();
}
}