使用 SQLXML 数据类型 之一

本文介绍如何使用SQLXML数据类型在关系数据库中存储和检索XML文档。通过Java代码示例展示了如何创建XML文档、初始化SQLXML对象及验证数据库是否支持XML数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 SQLXML 数据类型

适用于数据库 XML 类型的 Java 数据类型

Deepak Vohra (dvohra09@yahoo.com), 顾问, Independent
2006 年 6 月 10 日

如 果您是一名 Java™ 2 Enterprise Edition (J2EE) 开发人员,那么您可能想提前了解一下目前正在开发的 SQLXML 技术。查看使用 SQLXML Java 数据类型创建 XML 文档、在关系数据库中存储 XML 文档、从数据库中检索 XML 文档和导航 XML 文档的过程。

概述

J2EE 开发人员通常需要在关系数据库中存储 XML 文档以及从数据库中检索 XML 文档,以获得元素值和属性值。目前,只有特定于供应商的技术和数据类型可用于在关系数据库中存储 XML 文档。例如 IBM DB2 Universal Database™ (UDB) 提供了 DB2 XML Extender 和 XML 用户定义类型 (UDT) 来存储 XML 文档。用于 XML 类型列的标准数据类型和对应于 XML 类型列的 Java 数据类型将促进关系数据库中 XML 文档的存储和检索。SQL:2003 标准支持这样一种数据类型:新 XML 数据类型,以便在关系数据库中存储 XML 文档。借助 XML 数据类型,您可以在类似于其他数据类型的数据库表列中存储 XML 文档。DB2 Viper(即 DB2 UDB Version 9.1)支持 XML 数据类型。Java Database Connectivity (JDBC) 4.0 规范支持 SQL:2003 标准。

初步设置

在开始之前,确保拥有必要的组件。SQLXML 是一种 JDBC 4.0 数据类型。因为 SQLXML 数据类型是在 Sun 提供的 Java SE 6 Development Kit (JDK) 6.0 Beta 中实现的,所以您需要安装它。另一个要求是创建一个 SQLXML 类型对象,该对象是一个支持 XML 数据类型的关系数据库。DB2 Viper(即 DB2 UDB Version 9.1)支持 XML 数据类型。要运行本文中包含的示例应用程序 SQLXMLDB.java,需要安装 DB2 Viper 数据库,并创建示例 DB2 数据库实例 Sample。JDK 6.0 Beta、DB2 Viper 和 SQLXMLDB.java 可以分别从 参考资料下载 中获得。

您还需要一个 JDBC 4.0 驱动程序,但 DB2 UDB 目前并没有提供 JDBC 4.0 驱动程序,要运行带有 DB2 JDBC 3.0 驱动程序的 SQLXMLDB.java 并确定 DB2 数据库是否支持 XML 数据类型,需要将 JAR 文件 C:/Program Files/IBM/SQLLIB/java/db2jcc.jarC:/Program Files/IBM/SQLLIB/java/db2jcc_license_cu.jar 添加到 Classpath 中。当 JDBC 4.0 驱动程序变得可用时,就可以利用 SQLXML API 运行 SQLXMLDB.java 了。当 JDBC 4.0 驱动程序变得可用时,本文将被更新。

开始

SQLXML Java 数据类型允许您将 XML 类型数据库列映射到 Java 数据类型。在 JDBC 4.0 规范中,java.sql.Connection 接口可以创建一个最初没有任何数据的 SQLXML 对象,但您可以用 setString(String) 方法或 createXMLStreamWriter() 方法添加数据。SQLXML 对象可利用 getSQLXML(int columnIndex) 方法或 getSQLXML(String columnName) 方法从 ResultSetCallableStatement 对象中获得。可以用 getString() 方法或 createXMLStreamReader() 方法检索 SQLXML 对象中的数据,还可以用 PreparedStatement 接口的 setSQLXML(int parameterIndex, SQLXML sqlXML) 方法在类似于其他任何数据类型的类型 XML 的数据库表列中存储 SQLXML 对象。

清单 1 显示了一个您可以创建的 XML 文档的例子,即 catalog.xml


清单 1. 示例 XML 文档 catalog.xml


       
       



Elliotte Harold



Brett McLaughlin






回页首


选择数据库

需要一个关系数据库来支持 XML 数据类型存储 XML 文档,不是所有的数据库都支持 XML 数据类型。要确定数据库是否支持该数据库类型,需要从 Connection 对象中获得数据库元数据。例如,要测试 DB2 Viper 是否支持 XML 数据类型,需要加载并注册 com.ibm.db2.jcc.DB2Driver JDBC 驱动程序,即 DB2 JDBC Type 4 驱动程序:

 
Class.forName("com.ibm.db2.jcc.DB2Driver");

为 DB2 UDB 数据库指定连接 URL。DB2 UDB Type 4 驱动程序的格式为 jdbc:db2://<server>:<port>/<database>。在此连接 URL 中,<server> 是 DB2 UDB 服务器名称,<port> 是 DB2 数据库端口,而 <database> 是 DB2 数据库实例。DB2 UDB 数据库的连接 URL 是:

String url = "jdbc:db2://localhost:50000/Sample";

利用 DriverManager 的静态方法 getConnection() 获得与数据库的 Connection

Connection connection = DriverManager.getConnection(url,
"username", "password");

接下来,从 Connection 对象获得数据库元数据:

DatabaseMetaData metadata =  connection.getMetaData();

然后,利用 getTypeInfo() 方法获得受数据库支持的数据类型:

ResultSet rs = metadata.getTypeInfo();

在数据类型结果集上进行迭代并输出 TYPE_NAME 列:

System.out.println("TYPE_NAME:"+rs.getString("TYPE_NAME"));

如果数据库支持 XML 数据类型,则 XML TYPE_NAME 获得输出。由于 DB2 Viper 数据库支持 XML 数据类型,所以运行 SQLXMLDB.java 应用程序所得到的输出包括 XML 数据类型,如下所示:

TYPE_NAME: XML

创建 SQLXML 对象

这一节将讨论创建 SQLXML 对象的过程。首先,导入 java.sql package 和 javax.xml.stream 包。javax.xml.stream 包具有实例化 SQLXML 对象和获得 SQLXML 对象中的数据所需的 XMLStreamWriterXMLStreamReader 接口。

import java.sql.*;
import javax.xml.stream.*;

XML 文档在类型为 XML 的数据库表列中的 Java 表示是 SQLXML。要创建一个将存储在 XML 类型列中的 XML 文档,需要使用 createSQLXML() 方法从 Connection 对象创建一个 SQLXML 对象:

SQLXML sqlXML = connection.createSQLXML();

createSQLXML() 方法创建的 SQLXML 对象不包含任何数据。下一节 将展示如何将数据添加到 SQLXML 对象中。

初始化 SQLXML 对象

您可以使用 XMLStreamWriter 对象创建一个 XML 文档。可以使用 createXMLStreamWriter() 方法从 SQLXML 对象中创建 XMLStreamWriter 对象:

XMLStreamWriter xmlStreamWriter = sqlXML.createXMLStreamWriter();

如果调用 createXMLStreamWriter() 方法,而不是使用相同的 SQLXML 对象,则会抛出 SQLException,并且先前返回的 XMLStreamWriter 对象不受影响。

writeStartDocument(String encoding, String version) 方法添加 XML 文档的开始部分。writeStartDocument() 方法中指定的编码并没有设置 XML 文档输出的编码;指定的编码只设置 XML 声明中的编码。XMLStreamWriter 接口还包括 writeStartDocument() 方法和 writeStartDocument(String version) 方法,前者用于在没有指定编码和版本的情况下创建 XML 文档,后者用于在提供版本的情况下创建 XML 文档:

xmlStreamWriter.writeStartDocument("UTF-8","1.0");

writeStartElement(String localName) 方法(如下面代码片段所示)添加根元素 catalog 的开始部分。使用 writeStartElement(String prefix, String localName, String namespaceURI) 方法根据名称空间和前缀创建一个元素。使用 writeEmptyElement(String localName) 方法可生成一个空元素:

xmlStreamWriter.writeStartElement("catalog");

writeAttribute(String localName, String value) 方法添加 title 属性,如下面代码片段所示。同样,还可以添加 publisher 属性。如果属性有一个名称空间前缀,则使用方法 writeAttribute(String prefix, String namespaceURI, String localName, String value)

xmlStreamWriter.writeAttribute("title", "XML Zone");
xmlStreamWriter.writeAttribute("publisher", "IBM developerWorks");

类似地,还可以添加 journal 元素及其属性 date

xmlStreamWriter.writeStartElement("journal");
xmlStreamWriter.writeAttribute("date", "Jan 2006");

添加一个 article 元素和一个 title 元素:

xmlStreamWriter.writeStartElement("article");
xmlStreamWriter.writeStartElement("title");

writeCharacters(String text) 方法将文本添加到 title 元素中,如下面代码片段所示。此外,可以使用 writeCharacters(char[] text,int start,int len) 方法从 char[] 数组中添加文本。

xmlStreamWriter.writeCharacters("Managing XML data: Tag URIs");

确保 start 元素有一个相应的 end 元素标记。使用 writeEndElement() 方法添加一个 end 元素:

xmlStreamWriter.writeEndElement();

writeEndElement() 方法没有像 writeStartElement() 方法那样指定元素的本地名称。类似地,可以添加其他元素来创建 清单 1 中所示的 XML 文档。要完成 XML 文档,请调用 writeEndDocument() 方法。此外,请关闭 XMLStreamWriter 对象:

xmlStreamWriter.writeEndDocument();
xmlStreamWriter.close();

您还可以使用 SQLXML 接口的 setString(String) 方法将 XML 文档从 XML 字符串添加到 SQLXML 对象中,如 清单 2 所示。如果在前面已初始化的 SQLXML 对象上调用 setString(String) 方法,则会抛出 SQLException


清单 2. 将 XML 文档添加到 SQLXML 对象中

sqlXML.setString("
       
       



Elliotte Harold



Brett McLaughlin


");

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值