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 = |
用 setInt(int parameterIndex, int value)
方法设置 int
值,用 PreparedStatement
接口的 setSQLXML(int parameterIndex, SQLXML value)
方法设置 SQLXML
值,如下所示。如果没有在调用 setSQLXML()
方法前关闭 XMLStreamWriter
对象,则会抛出 SQLException
。
statement.setInt(1, 1); |
用 executeUpdate()
方法更新数据库:
statement.executeUpdate(); |
SQLXML
对象至少在创建 SQLXML
对象期间是有效的。如果不使用某个 SQLXML
对象,则可以使用 free()
方法释放这个 SQLXML
对象资源:
sqlXML.free(); |
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( |
从数据库表 Catalog
获得一个 ResultSet
,该表有一个 XML
类型的列。可以移动 ResultSet
游标来插入一个行。还可以使用 updateSQLXML()
方法添加 SQLXML
列值。updateSQLXML()
方法不更新数据库。要更新数据库,需要调用 insertRow()
方法:
ResultSet rs = stmt.executeQuery("SELECT * from Catalog"); |
此外,要在可滚动的 ResultSet
中从当前行更新 ResultSet
,需要使用 absolute(int)
或 relative(int)
方法移动到 ResultSet
行。可以使用 updater 方法之一修改 SQLXML
值。使用 updateRow()
方法更新数据库:
rs.absolute(5); |
如果没有在调用 updater 方法之前关闭 XMLStreamWriter
对象,则会抛出 SQLException
。
以 SQLXML
数据类型的形式检索 XML
数据库类型列值。为 SELECT
SQL 查询创建一条 PreparedStatement
,以便从数据库表 Catalog
中获得 ResultSet
,如下面代码片段所示。SQL 语句有一个用于 CatalogId
值的参数标志符。
PreparedStatement stmt = |
指定将从中检索 XML 文档的 CatalogId
值:
stmt.setInt(1, 1); |
用 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()); |
使用 XMLStreamReader
接口读取具有事件迭代器的 SQLXML
对象中的 XML 文档。从将被导航的 SQLXML
对象中创建一个 XMLStreamReader
对象:
XMLStreamReader xmlStreamReader = sqlXML.createXMLStreamReader(); |
下一个解析事件是用 next()
方法获得的:
while(xmlStreamReader.hasNext()){ |
next()
方法返回一个对应于 XMLStreamConstants
常量的 int
值。表 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){ |
可以使用 getAttributeCount()
方法获得元素中的属性总数。还可以在属性上进行迭代,使用 getAttributeLocalName()
方法获得属性本地名称,使用 getAttributeValue()
方法获得属性值,使用 getAttributePrefix()
方法获得属性前缀,以及使用 getAttributeNamespace()
方法获得属性名称空间:
for(int i=0; i<xmlstreamreader.getattributecount();i++){ font="" |
如果解析事件的类型为 CHARACTERS
,可使用 getText()
方法获得解析事件的文本:
if(parseEvent==XMLStreamConstants.CHARACTERS){ |
SQLXML
数据类型为数据库类型 XML
提供了数据库到 Java 的映射工具。您可以对任何支持 XML 数据类型并提供 JDBC 4.0 驱动程序的数据库使用 SQLXML
数据类型。特定于供应商的 XML-to-SQL API 对 SQLXML
不是必需的。SQLXML
API 将包含在 JDK 6.0 中。DB2 Viper 支持 XML
数据类型。