使用 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 中。PreparedStatementINSERT 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.free();

更新 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 值:

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());

访问 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指定一个属性
CDATACData 部分
CHARACTERS文本
NOTATION_DECLARATION指定一个符号声明
COMMENTXML 文档注释
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++){ font=""  

如果解析事件的类型为 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 数据类型。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值