通过Java操控Oracle对象(1)

来源:互联网 发布:知乎人生赢家标准 编辑:程序博客网 时间:2024/06/05 12:49

对象是用户自定义的复合数据, 它封装了数据及操作数据的方法.
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();
   }

原创粉丝点击