概述
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.jar
和 C:/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)
方法从 ResultSet
或 CallableStatement
对象中获得。可以用 getString()
方法或 createXMLStreamReader()
方法检索 SQLXML
对象中的数据,还可以用 PreparedStatement
接口的 setSQLXML(int parameterIndex, SQLXML sqlXML)
方法在类似于其他任何数据类型的类型 XML
的数据库表列中存储 SQLXML
对象。
清单 1 显示了一个您可以创建的 XML 文档的例子,即 catalog.xml
:
清单 1. 示例 XML 文档 catalog.xml
<catalog title="XML Zone" publisher='IBM developerWorks'> <journal date="Jan 2006"> <article> <title>Managing XML data: Tag URIs</title> <author>Elliotte Harold</author> </article> <article> <title>Practical data binding: XPath as data binding tool, Part 2</title> <author>Brett McLaughlin</author> </article> </journal></catalog>
|
选择数据库
需要一个关系数据库来支持 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
数据类型,如下所示:
创建 SQLXML 对象
这一节将讨论创建 SQLXML
对象的过程。首先,导入 java.sql package 和 javax.xml.stream 包。javax.xml.stream 包具有实例化 SQLXML
对象和获得 SQLXML
对象中的数据所需的 XMLStreamWriter
和 XMLStreamReader
接口。
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("<catalog title="XML Zone" publisher='IBM developerWorks'> <journal date="Jan 2006"> <article> <title>Managing XML data: Tag URIs</title> <author>Elliotte Harold</author> </article> <article> <title>Practical data binding: XPath as data binding tool, Part 2</title> <author>Brett McLaughlin</author> </article> </journal></catalog>");
|
下一节 解释如何将创建的 SQLXML
对象存储到数据库中。
存储 SQLXML 对象
SQLXML
Java 数据类型存储在 XML 文档中,就像其他任何 Java 数据类型那样。首先,用 XML
类型列创建一个数据库表。可以借助 SQL 命令行工具或 JDBC API,用 XML
类型列创建数据库表。要用 JDBC 创建数据库表,需要从 Connection
对象中获得一个 Statement
对象:
Statement stmt = connection.createStatement();
|
用 XML
类型列创建一个数据库表,比如 Catalog
:
stmt.executeUpdate("CREATE Table Catalog(CatalogId INTEGER, Catalog XML)");
|
将 前一节 中创建的 SQLXML
对象添加到数据库中。创建一个 PreparedStatement
对象,以便将值添加到数据库表 Catalog
中。PreparedStatement
由 INSERT
SQL 语句和用来添加到数据库的那些值的参数标志符组成:
PreparedStatement statement = connection.prepareStatement("INSERT INTO CATALOG(catalogId, catalog) VALUES(?,?)");
|
用 setInt(int parameterIndex, int value)
方法设置 int
值,用 PreparedStatement
接口的 setSQLXML(int parameterIndex, SQLXML value)
方法设置 SQLXML
值,如下所示。如果没有在调用 setSQLXML()
方法前关闭 XMLStreamWriter
对象,则会抛出 SQLException
。
statement.setInt(1, 1);statement.setSQLXML(2, sqlXML);
|
用 executeUpdate()
方法更新数据库:
statement.executeUpdate();
|
SQLXML
对象至少在创建 SQLXML
对象期间是有效的。如果不使用某个 SQLXML
对象,则可以使用 free()
方法释放这个 SQLXML
对象资源:
更新 SQLXML 对象
JDK 6.0 Beta 还在 ResultSet
接口中提供了一些 updater 方法来更新 SQLXML
值。updater 方法 updateSQLXML(int columnIndex, SQLXML sqlXML)
和 updateSQLXML(String columnName, SQLXML sqlXML)
可修改当前行中的 SQLXML
值或 ResultSet
对象的插入行。例如,要在 ResultSet
对象中添加新行,需要获得一个不可更新的 ResultSet
类型的 Statement
对象:
Statement stmt = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
|
从数据库表 Catalog
获得一个 ResultSet
,该表有一个 XML
类型的列。可以移动 ResultSet
游标来插入一个行。还可以使用 updateSQLXML()
方法添加 SQLXML
列值。updateSQLXML()
方法不更新数据库。要更新数据库,需要调用 insertRow()
方法:
ResultSet rs = stmt.executeQuery("SELECT * from Catalog");rs.moveToInsertRow();rs.updateSQLXML(2, xmlObject);rs.insertRow();
|
此外,要在可滚动的 ResultSet
中从当前行更新 ResultSet
,需要使用 absolute(int)
或 relative(int)
方法移动到 ResultSet
行。可以使用 updater 方法之一修改 SQLXML
值。使用 updateRow()
方法更新数据库:
rs.absolute(5);updateSQLXML("catalog", xmlObject)rs.updateRow();
|
如果没有在调用 updater 方法之前关闭 XMLStreamWriter
对象,则会抛出 SQLException
。
从 ResultSet 对象检索 SQLXML 对象
以 SQLXML
数据类型的形式检索 XML
数据库类型列值。为 SELECT
SQL 查询创建一条 PreparedStatement
,以便从数据库表 Catalog
中获得 ResultSet
,如下面代码片段所示。SQL 语句有一个用于 CatalogId
值的参数标志符。
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM CATALOG WHERE CatalogId=?");
|
指定将从中检索 XML 文档的 CatalogId
值:
用 executeQuery()
方法获得一个结果集:
ResultSet rs = stmt.executeQuery();
|
使用 ResultSet
接口的方法 getSQLXML(int columnIndex)
或 getSQLXML(String columnName)
获得用于 XML 类型 Catalog
列的 SQLXML
对象:
SQLXML sqlXML = rs.getSQLXML("Catalog");
|
要在 SQLXML
对象中输出 XML 文档,可能需要使用 SQLXML
接口的 getString()
方法:
System.out.println(sqlXML.getString());
|
访问 SQLXML 对象
使用 XMLStreamReader
接口读取具有事件迭代器的 SQLXML
对象中的 XML 文档。从将被导航的 SQLXML
对象中创建一个 XMLStreamReader
对象:
XMLStreamReader xmlStreamReader = sqlXML.createXMLStreamReader();
|
下一个解析事件是用 next()
方法获得的:
while(xmlStreamReader.hasNext()){int parseEvent = xmlStreamReader.next();}
|
next()
方法返回一个对应于 XMLStreamConstants
常量的 int
值。表 1 列出了 next()
方法的返回值。
表 1. 方法 next() 的返回值
解析事件描述
ATTRIBUTE |
指定一个属性 |
CDATA |
CData 部分 |
CHARACTERS |
文本 |
NOTATION_DECLARATION |
指定一个符号声明 |
COMMENT |
XML 文档注释 |
PROCESSING_INSTRUCTION |
指定一个处理指令 |
START_DOCUMENT |
指定文档的开始处 |
START_ELEMENT |
指定元素的开始处 |
END_ELEMENT |
指定元素的结尾处 |
ENTITY_DECLARATION |
指定一个实体声明 |
ENTITY_REFERENCE |
指定一个实体引用 |
NAMESPACE |
指定一个名称空间声明 |
SPACE |
指定一个可忽略的空白 |
END_DOCUMENT |
指定文档的结尾处 |
DTD |
指定一个 DTD |
如果返回值是 START_ELEMENT
,则解析事件指示某一元素已经被解析。可以使用方法 getLocalName()
、getPrefix()
、getNamespaceURI()
获得本地名称、前缀和名称空间元素:
if(parseEvent==XMLStreamConstants.START_ELEMENT){System.out.println("Element Local Name: "+xmlStreamReader.getLocalName());System.out.println("Element Prefix: "+xmlStreamReader.getPrefix());System.out.println("Element Namespace:"+xmlStreamReader.getNamespaceURI()); }
|
可以使用 getAttributeCount()
方法获得元素中的属性总数。还可以在属性上进行迭代,使用 getAttributeLocalName()
方法获得属性本地名称,使用 getAttributeValue()
方法获得属性值,使用 getAttributePrefix()
方法获得属性前缀,以及使用 getAttributeNamespace()
方法获得属性名称空间:
for(int i=0; i<xmlStreamReader.getAttributeCount();i++){System.out.println("Attribute Prefix:"+xmlStreamReader.getAttributePrefix(i));System.out.println("Attribute Namespace:"+xmlStreamReader.getAttributeNamespace(i));System.out.println("Attribute Local Name:"+xmlStreamReader.getAttributeLocalName(i));System.out.println("Attribute Value:"+xmlStreamReader.getAttributeValue(i));}
|
如果解析事件的类型为 CHARACTERS
,可使用 getText()
方法获得解析事件的文本:
if(parseEvent==XMLStreamConstants.CHARACTERS){ System.out.println("CHARACTERS text: "+xmlStreamReader.getText()); }
|
结束语
SQLXML
数据类型为数据库类型 XML
提供了数据库到 Java 的映射工具。您可以对任何支持 XML 数据类型并提供 JDBC 4.0 驱动程序的数据库使用 SQLXML
数据类型。特定于供应商的 XML-to-SQL API 对 SQLXML
不是必需的。SQLXML
API 将包含在 JDK 6.0 中。DB2 Viper 支持 XML
数据类型。
下载:源代码下载
相关推荐
根据给定的文件标题、描述、标签以及部分内容,本文将详细介绍如何在SQL Server 2005 和 2008 中操作XML数据类型,并简要介绍与之相关的C# XML操作方法。 ### 一、SQL Server 2005/2008 XML 数据类型操作 #### 1. ...
在SQL Server 2005中,XML数据类型是一个强大的特性,允许开发人员在数据库中存储和处理XML数据。XML数据类型不仅可以存储完整的XML文档,还可以与其他关系数据一起使用,从而实现灵活的数据建模。 首先,XML数据...
这在将SQLXML数据导入Java应用程序或从应用程序中导出时非常有用。 4. **SQLXML API**: SQL Server提供了一组名为SQLXML的API,这些API可以帮助开发人员在T-SQL(Transact-SQL)中处理XML数据。它们包括XML方法(如...
SQL Server 2005 中使用 XML 数据类型进行数据建模 SQL Server 2005 提供了 XML 数据类型,以便更好地处理和存储 XML 数据。在本文中,我们将介绍如何使用 XML 数据类型在 SQL Server 2005 中进行数据建模。 XML ...
SQL Server 数据库类型对应 Java 中的数据类型 SQL Server 是一个关系数据库管理系统,Java 是一个广泛使用的编程语言。在 Java 中,对数据库的操作需要通过 JDBC(Java Database Connectivity)来实现,而在 JDBC ...
除了上述基本类型外,SQL Server还提供了一些特殊数据类型,如`bit`用于存储布尔值(0或1),`uniqueidentifier`用于存储GUID,以及`xml`类型用于存储XML文档等。 ### 结论 掌握SQL Server中的数据类型对于有效地...
- 对于**xml**类型,虽然C#默认将其映射为`string`类型,但在处理复杂的XML文档时,可以考虑使用.NET Framework提供的`SqlXml`类型来提高效率和安全性。 #### 三、注意事项 - **性能考量**:某些情况下,如频繁...
3. **XML数据类型**: SQL Server支持XML作为内置数据类型,可以直接在数据库中存储XML文档,并提供一系列函数(如.value, .nodes, .modify)来处理这些数据。 4. **XSLT处理**: SQLXML支持使用XSL样式表进行XML到...
在SQL Server 2005中,XML数据类型的性能优化是一项关键任务,因为XML在现代企业应用程序中扮演着越来越重要的角色,特别是在处理半结构化和非结构化数据时。SQL Server 2005引入了对XML的原生支持,允许XML数据存储...
这个“SQLXML_Sample”示例着重展示了如何使用SQLXML来映射XML文件到关系数据库中,特别是针对博客文章的附件处理。XML(eXtensible Markup Language)是一种用于标记数据的语言,它允许数据以结构化的方式表示,...
- **二进制大型对象**: `sql_variant`可以存储多种数据类型,但不建议在大规模系统中使用。 - **用户自定义类型**: 支持创建自定义类型,基于已有的系统数据类型。 6. **空值和特殊数据类型** - **NULL值**: ...
### Microsoft Access 数据类型与 SQL Server 数据类型的主要区别 ...在从 Access 迁移到 SQL Server 时,需要注意这些差异,并根据实际情况调整数据类型和函数的使用,以确保数据迁移的顺利进行。
在SQL Server中,XML数据类型提供了强大的功能,用于存储、查询和处理XML文档。本示例将深入探讨如何使用SQL语言解析XML数据,这在处理包含复杂结构信息的数据时非常有用。我们将通过分析`Test01.sql`脚本和参考`a....
在SQL Server中,数据类型是定义列、变量和其他数据库对象属性的关键部分。它们决定了可以存储在这些对象中的数据种类和格式。SQL Server提供了多种数据类型,以满足不同类型的存储需求。下面将对这些数据类型进行...
网上整理的文章,该文章深入探讨了有关提升Microsoft® SQL Server™ 2005中XML数据类型的查询和修改操作性能的诸多问题。为了更好的理解本文,您最好事先熟悉SQL Server 2005中有关XML的相关特性。作为背景材料,您...
在.NET中,对应的类型是`System.String`,也可以使用`System.Xml.Linq.XElement`来处理XML数据。 理解这些对应关系对于在.NET环境中使用SQL Server数据库进行开发至关重要,它可以确保数据在数据库与应用程序之间的...
在C#编程中,将任意类型的泛型集合转换成SQLXML数据格式是一项常见的任务,尤其在数据处理和存储过程中。本文将深入解析如何利用C#实现这个功能,并提供相关的实例代码。 首先,让我们理解一下涉及的关键概念: 1....