JDBC

日期:2003 年5 月 6 日

如何使用 JDBC 保持和检索用户定义 SQL 对象

完成此方法文档后,您应该能够:
  • 辨别从 JDBC 访问用户定义 SQL 对象的不同机制。
  • 理解如何使用 java.sql.STRUCT 类和相应的 Oracle 扩展来操纵 oracle 对象。

简介

对象类型是用户定义的复合数据类型,它封装了一个数据结构以及操纵这些数据所需的函数和过程。数据被称为属性,而对数据的操作的集合被称为该对象类型的方法。

运行示例的前提条件

您需要以下条件才能运行此示例 -

  • Oracle9i 数据库。可从此处下载。
  • Oracle9i JDBC 驱动程序。可从此处下载。
  • JDK 1.3 或更高版本。可从此处下载。

说明

有两种方法可以把对象类型保持到数据库中,以及从数据库中检索对象类型 -

  1. 用一个标准的普通 JDBC 类型映射到 Oracle 对象 - 在本文档中,我们将讨论用这种方法从数据库中保持和检索对象类型。
  2. 通过创建定制 Java 类来定制映射 - Oracle JPublisher 工具可用于生成定制 java 类。

为了更容易理解,我们在此文档中用一个雇员对象作为例子。雇员可以有不同的属性,如姓名、职务、部门编号等。该对象的创建方法如下所示

CREATE OR REPLACE TYPE EMP_TYPE AS OBJECT (
NAME VARCHAR2(50),
TITLE VARCHAR2(30),
DEPT_NUM NUMBER(2)
);
/

现在,我们来看看在包含上面的对象类型作为一个列的表中如何执行诸如选取和插入这样的 DML 操作。表的创建如下所示

CREATE TABLE EMP_TABLE (
INFO EMP_TYPE
);
/

从 emp_tab 表中选取

这里是从 emp_type 对象中选取值的代码段。为了简单起见,假设连接对象已经存在。现在,我们在 emp_table 表上执行一个简单的查询。为了从结果集中取回值,我们使用了 java.sql.STRUCT 的一个实例,如第 5 行所示。可以通过 Struct 实例获取 emp_type 对象的属性值。

  1. ......
  2. Statement stmt = conn.createStatement();
  3. ResultSet rs= stmt.executeQuery("SELECT * FROM emp_table");
  4. if (rset.next()) {
  5. java.sql.Struct empType = (java.sql.Struct)rs.getObject(1);
  6. System.out.println("Number of attributes "+ empType.getAttributes().length);
  7. System.out.println("Name is " + empType.getAttributes()[0]);
  8. System.out.println("Designation is " + empType.getAttributes()[1]);
  9. System.out.println("Department is " + empType.getAttributes()[2]);
  10. }
  11. stmt.close();
  12. ......

注意:也可以使用 Oracle 扩展方法获得同样的功能,如下所示:


oracle.sql.STRUCT oracleSTRUCT=((OracleResultSet)rs).getSTRUCT(1);
oracle.sql.Datum[] attrs = oracleSTRUCT.getOracleAttributes();

System.out.println("Number of attributes.."+ attrs.length);
System.out.println("Name is " + attrs[0].stringValue());
System.out.println("Designation is " + attrs[1].stringValue());
System.out.println("Department is " + attrs[2].intValue());


如上所示,另一个将对象作为 STRUCT 对象返回的方法是把结果集分派给一个 OracleResultSet 对象并使用 Oracle 扩展 getSTRUCT() 方法。为了从 STRUCT 实例或 oracle.sql 类型的 Struct 实例中获取 Oracle 对象属性,需要使用 oracle.sql.STRUCT 类的 getOracleAttributes() 方法。

oracle.sql.STRUCT 类实现 java.sql.Struct 接口并在 JDBC 2.0 标准的基础上提供扩展功能。STRUCT 类除了标准的 Struct 功能外,还包含下面的方法:

  • getOracleAttributes():以 oracle.sql.* 对象的形式获取值数组的值。
  • getDescriptor():为对应于此 STRUCT 对象的 SQL 类型返回 StructDescriptor 对象。
  • getJavaSQLConnection():返回当前的连接实例 (java.sql.Connection)。
  • toJdbc():参考连接的默认类型映射,以决定映射到什么类,然后使用 toClass()。
  • toJdbc(map):参考指定的类型映射,以决定映射到什么类,然后使用 toClass()。

插入到 emp_tab 表

这里是使用 STRUCT 对象和描述符插入到 emp_table 的代码段。同样,我们假设连接对象已经存在。
  1. .....
  2. PreparedStatement stmt = connection.prepareStatement("INSERT INTO emp_table VALUES(?)");
  3. StructDescriptor structdesc = StructDescriptor.createDescriptor("EMP_TYPE", connection);
  4. Object[] attributes = {"Sujatha Ranganathan","Developer","20"};
  5. STRUCT empType= new STRUCT(structdesc, connection, attributes);
  6. stmt.setObject(1, empType);
  7. stmt.execute();
  8. stmt.close();
  9. .....

如上所示,构造一个 STRUCT 对象需要一个 StructDescriptorStructDescriptor 的构造函数要求您把 Oracle 对象类型的 SQL 类型名称和一个连接对象传递给它,如第 2 行所示。下一步是形成一个对象数组,包含与对象 emp_type 相对应的属性值。最后使用 StructDescriptor 和用来绑定准备语句的连接对象构造 STRUCT 对象。

运行示例

此示例的完整源代码可以在此获得。这一节讨论运行示例程序的相关指导

第 1 步 使用 Winzip,或使用下面的命令解压缩 ObjectTypes.jar

> jar xvf ObjectTypes.jar

这会创建目录 ObjectTypes。

第 2 步 此应用程序需要创建一个在示例中使用的数据库表。要创建该表和对象类型,运行 SQL*Plus,以 scott/tiger 连接到您的数据库,然后执行 ObjectTypes 目录下的 ObjectTypes.sql,如下所示:

sql>@ObjectTypes.sql

第 3 步 编辑文件 ObjectTypes.java。在方法 dbConnection() 中,将下面的行修改为您的数据库连接参数
connection = DriverManager.getConnection("jdbc:oracle:thin:@<hostname>:<port>:<SID>", "scott","tiger");

第 4 步 设置 CLASSPATH 环境变量,使其包含 Oracle9i JDBC 驱动程序文件:classes12.zip 或 classes12.jar 或 ojdbc14.jar。 还要确认 PATH 系统变量包含 JDK 的 bin 目录。

第 5 步 使用 javac 编译 java 文件:

例如:
D:\ObjectTypes\>javac ObjectTypes.java

第 6 步 使用 java 运行类文件

例如:
D:\ObjectTypes\>java ObjectTypes.java

资源


寄送此页面
Printer View 打印机视图