科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道DB2 9:打开通往 XML 之门

DB2 9:打开通往 XML 之门

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在本文中,我将展示关于如何使用 Java 构建采用 DB2 “pureXML” 技术的应用程序的详细例子,pureXML 技术允许以 XML 固有的分层格式存储和查询 XML。

作者:Cynthia M. Saracco 来源:论坛整理 2007年12月15日

关键字: DB2

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

 插入 XML 数据

  DB2 程序员使用熟悉的 SQL INSERT 语句来将新的 XML 数据写到包含 XML 列的表中。DB2 可以存储最大为 2 GB 的任何格式良好的 XML 文档。

  通常,Java 程序员需要将包含在文件中的 XML 数据插入到 DB2 表中,但是,他们也可以插入来自字符串、二进制数据(包括大型对象)和 SQL 子选择语句中的 XML 数据。

  清单 3 展示了将一行插入到 CLIENTS 表中的方法。在这个例子中,contactinfo 列的 XML 文档是从一个文件中读取的。

  

  我们来逐步考察这段代码。insertFile() 方法定义了一些变量,这些变量将在 INSERT 语句中用到。前三个变量对应于 CLIENTS 表中的 ID、name 和 status 这三列。第四个变量是要插入到 contactinfo 列的 XML 文件的文件名。(为简单起见,在这个例子中这些值是硬编码的。)

  建立了数据库连接之后,该方法创建一个 sqlstmt 字符串,其中包含用于输入列值的四个参数占位符。然后像通常一样准备 INSERT 语句,并设置它的四个参数占位符。为了设置用于 XML 列的占位符,该方法打开一个 FileInputStream。它还计算被引用的 XML 文件的长度,并使用该信息作为 setBinaryStream() 方法的输入。最后,该方法执行 INSERT 语句,将 XML 和传统 SQL 数据插入到这个表中的一行中。

  DB2 还允许用户注册 XML 模式,并且还允许用户在插入之前用这些模式来验证输入文档,不过这个特性在上述代码中没有体现出来。XML 模式是万维网联盟(W3C)业界标准的一部分;XML 模式使用户可以指定符合规范的 XML 文档应有的结构,例如可接受的 XML 元素的顺序和数据类型,特定 XML 名称空间的使用,等等。

  查询 XML 数据

  现在您已经将 XML 数据插入到了 DB2 中,接下来可以查询 XML 数据了。DB2 允许编写各种类型的查询。您可以编写用于检索整个 XML 文档的简单查询,也可以编写根据 XML 谓词和关系查询谓词检索 XML 文档中的某些部分的高级查询。DB2 还支持其他类型的一些查询,例如将 XML 数据转换到新的 XML 文档,连接 XML 和非 XML 数据,聚合各种类型的数据,等等。在本文中,我将演示这样一个查询:

  •   基于关系谓词和 XML 谓词过滤数据
  •   检索符合条件的 XML 文档的某些部分以及存储在传统 SQL 列中的数据。

  DB2 目前支持两种查询语言:SQL 和 XQuery。一个应用程序可以包含用其中一种或两种语言编写的不同查询。XQuery 不支持参数占位符。实际上,这意味不需要硬编码查询谓词的 Java 应用程序中的 XQuery 查询,必须被包装在一个使用 SQL/XML 函数(例如 XMLQuery()、XMLExists() 或 XMLTable())的 SQL 语句中。本文中的示例应用程序使用 XMLQuery() 和 XMLExists() 来阐释一个常见的编程任务:检索 XML 文档的某些部分。

  清单 4 中展示的例子返回居住在邮政编码为 95125 的地区的 “黄金(Gold)” 客户的姓名和首选电子邮件地址。客户姓名和状态信息(例如 “Gold” 或 “Silver”)存储在 SQL VARCHAR 列,而电子邮件地址和邮政编码则包含在存储在 contactinfo 列中的 XML 文档中。因此,这个例子同时涉及到传统 SQL 数据和 XML 数据。

  

  对于查询变量中定义的查询语句有必要更仔细地作一番考察,特别是那些不熟悉 SQL/XML 和 XQuery 的读者更要加以注意。虽然对这些语言作彻底的讨论已超出了本文的范围,不过我们将详细分析这个查询中的每一行,使您理解它的逻辑。

  第一行指定 SQL name 列和 XMLQuery() 函数的输入将被包括在结果集中。为了指示 DB2 检索第一个符合条件客户的 email 元素,代码中包括了一个 XPath 表达式。XPath 是 XQuery 的一部分,它提供了一种在 XML 文档层次之间进行导航的方式。这个 XPath 表达式指示 DB2 导航到每个符合条件的 XML 文档的 Client 根元素下的第一个 email 元素。(注意,路径表达式是大小写敏感的)。$c 变量和 SQL FROM 子句表明这些文档可以在哪里找到(在 CLIENTS 表的 contactinfo 列中)。

  SQL WHERE 子句用于限制返回的数据。特别地,它规定返回的 XML 文档只包括客户状态为某个特定值(Gold)的行中的 XML 文档。而且,只有居住在某个特定地区(邮政编码为 95125)的客户的记录才符合条件。XMLExists() 函数指定后一个限制。

  在这个示例查询中,XMLExists() 指示 DB2 确定一个给定的 XML 文档中是否包括指定邮政编码的客户地址。PASSING 子句指定可以在哪里找到 XML 文档(在 contactinfo 列中)。注意,这个 PASSING 子句中的 $x 周围出现了转义符(反斜杠)。这个查询的最后一行调用 CAST() 函数来将输入参数(用于邮政编码)的值强制转换为适当的 SQL 数据类型。在这个例子中,由 5 个字符组成的字符串是可以接受的。清单 5 展示了这个程序的输出。

  

  在这个示例输出中,有一个符合条件的客户(Edward Chen)没有返回电子邮件信息。这表明他的 XML contactinfo 文档中没有包含 email 元素,可能是因为他在客户简历表中没有提供电子邮件地址。还应注意,虽然 Paula Lipenski 的联系方式信息中有两个电子邮件地址(见图 1),但是输出中只返回了她的一个电子邮件地址。这是因为示例应用程序显式地指示 DB2 只检索符合条件的客户的第一个电子邮件地址。(见 XMLQuery() 函数中的 XPath 表达式。)如果要去掉输入中的 <:email> 标记,那么可以使用 XMLQuery() 函数中的一个路径表达式来指示 DB2 只返回 email 元素的文本值 $c/Client/email[1]/text()。

  编程提示

  虽然 DB2 的本地 XML 支持是新的,但是良好的数据库应用程序编程实践仍然适用。例如,指示 DB2 只检索需要的数据这一点仍然很重要。如果只需要检索 XML 文档中包含的部分信息,那么检索整个 XML 文档就会降低性能,另外还会不必要地消耗一些系统资源。类似地,您应该仔细考虑事务的范围和隔离级别,在整体并发性与完整性之间取得平衡。

  本文是一篇介绍性的文章,因此探索 DB2 9 的 XML 特性超出了本文的范围,但是这样做是值得的。正如您可能期望的那样,DB2 允许程序员使用熟悉的 SQL 语句更新和删除 XML 数据。此外,IBM 还在 IBM developerWorks 上发布了一个用于 XML 数据的 “update” 存储过程(“将 XML 应用程序从 DB2 8.x 迁移到 DB2 Viper,第 1 部分”;见参考资料)。这个存储过程允许用户只提供更改的 XML 数据来进行更新,而不必提供修改的 XML 文档的全部内容。

  DB2 Developer Workbench 中有一些用于帮助程序员图形化地构造 SQL/XQuery 查询和 XQuery 查询的向导。它还提供了用于构建操纵传统 SQL 数据或本地 XML 数据的存储过程的向导。所有向导都可以在 workbench 的 Data 透视图中启动。

  要获得关于所有这些专题的详细信息,请参阅相应的在线文档或本文后面列出的参考资料。

  新鲜,但是熟悉

  需要处理存储在 DB2 中的本地 XML 数据的 Java 程序员可以使用熟悉的 JDBC 语句来执行查询和处理结果。为帮助程序员编写、测试和调试他们的 Java 应用程序,IBM 提供了一个基于 Eclipse 的 Developer Workbench for DB2。这个 workbench 提供了用于查看数据库内容、用 SQL/XML 或 XQuery 编写查询以及生成存储过程的向导。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章