介绍
IBM WebSphere® Studio Application Developer 是一种应用程序开发产品,它支持用 JSP、servlet、HTML、XML、Web 服务、数据库和 EJB 等不同的技术构建多种应用程序。Application Developer 还特别提供 XML 与关系数据的紧密集成。Application Developer 支持所有 WebSphere Application Server 支持的数据库,其中包括 DB2®、Oracle Sybase 和 Microsoft® SQL Server™。
本文是关注于随 WebSphere Studio Application Developer 提供的 XML 工具的系列文章的第 5 部分。 第 1 部分讨论如何使用 WebSphere Studio Application Developer 开发 XML Schema; 第 2 部分演示如何使用 Application Developer 的 SQL Builder 创建 SQL 查询; 第 3 部分讨论 Application Developer 中可用来将数据访问和 XML 结合到您的应用中的功能;而 第 4 部分探讨的是创建和编辑 XML 文档的可视化工具 XML Editor。
本文,即第 5 部分,主要介绍 RDB to XML Mapping Editor。RDB to XML Mapping Editor 允许用户把 XML 数据映射成关系数据,反之亦然。然后该工具可以用于生成 DAD 文件,您可以一起使用它和 DB2 XML Extender 在 XML 文件里检索或存储关系数据。
先决条件
为了照着执行该示例,您需要已安装下列产品:
- WebSphere Studio Application Developer 4.0
- DB2 UDB,版本 7.1 修订包 3 或更新版本
- DB2 XML Extender,版本 7.2 修订包 5
注:这些示例可以在 Windows® 或 Linux 操作系统上运行。
什么是 DB2 XML Extender?
DB2 XML Extender 是对 DB2 的扩展,它提供存储 XML 文档或从现有的关系数据生成 XML 文档的能力。DB2 XML Extender 还提供新的数据类型、函数和存储过程以管理 DB2 中的 XML 数据。
有关 DB2 XML Extender 的更多信息,请参考 DB2 XML Extender Library。
什么是 DAD 文件?
DAD(Document Access Definition,文档访问定义)文件是 XML 格式的文件,它把 XML 文档结构关联到 DB2 数据库。DB2 XML Extender 使用 DAD 把 XML 数据合成或分解为关系数据。想得到关于 DAD 文件及其特殊语法的更多信息,请参考 DB2 XML Extender Library。
为什么使用 RDB to XML Mapping Editor?
RDB to XML Mapping Editor 被设计成与 DB2 XML Extender 结合使用。通过采用如下技术,它使开发任务变得简单:
- 提供可视化界面使您很容易就可以定义关系数据和 XML 元素及属性之间的映射。
- 自动生成 DAD 文件,这些文件通常需要手工编码,而且很容易出错。
- 自动生成多种平台上的测试功能库,可用于 使 DB2 XML Extender 可以使用 DB2 数据库,以及保存和检索来自关系数据的 XML 文件。
DB2 XML Extender 与 SQL to XML 组件
在本系列的 第 3 部分中,我们曾介绍过 SQL to XML 向导及 WebSphere Studio Application Developer 中相应的 Java™ 库。正如我们提到的,RDB to XML Mapping Editor 被设计成与 DB2 XML Extender 一起使用。但是,如果一个机构使用其它厂商的数据库,SQL to XML 组件就提供了另外一种选择。SQL to XML 组件支持目前 WebSphere Application Server 支持的所有 JDBC 数据库。
RDB to XML Mapping Editor/DB2 XML Extender 和 SQL to XML 组件之间的主要区别是:RDB to XML Mapping Editor/DB2 XML Extender 在定义关系表和 XML 数据之间的映射结构时提供更多的灵活性。利用 DB2 XML Extender 和 Mapping Editor,您可以把任意的 SQL 查询或多个表映射到 XML 文档。在使用 SQL to XML 组件时,是按一组特定的映射模式严格的一对一映射。
扩展 Video Store 示例
本文中的示例是对以前的文章中音像店样本的扩展。对于这个示例,我们感兴趣的是检索和存储信息,这些信息是有关所有顾客( Customer Id
和 Customer Name
)、每位顾客租的所有录像带( Vid Id
和 Video Name
)以及租借每盘录像带的日期的。通过将 RDB to XML Mapping 工具中的 RDB Table Map选项用于生成 DAD 文件和测试功能库就可以实现这一点。测试功能库将被用于 使 DB2 XML Extender 可以使用 DB2 数据库,以及保存和检索来自关系数据库的 XML 数据。用于本示例的数据存储在三个数据库表 — CUSTOMERS、VIDEOS 和 RENTALS — 中,您会发现,这三个表都在 VIDEOS 数据库中。
XML 输入和输出文件将使用如下 DTD 文件。请参见下面清单 1。
清单 1. CustomerRental.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT CustomerRental (Customer*)> <!ELEMENT Customer (Rental*)> <!ATTLIST Customer ID CDATA #IMPLIED Name CDATA #IMPLIED> <!ELEMENT Rental (VideoName)> <!ATTLIST Rental Date CDATA #IMPLIED VidID CDATA #IMPLIED> <!ELEMENT VideoName (#PCDATA)>
创建项目目录结构
在 Workbench 中,创建一个名为 CustomerRentals
的项目。在该项目中创建下列三个文件夹: db
、 dtd
和 testharness
。这些目录将分别用于容纳导入的数据库、 CustomerRental.dtd
文件以及生成的测试功能库文件。
连接到数据库然后导入本地副本
请参考本系列的 第 2 部分,该文是有关如何连接到 VIDEOS 数据库并把本地副本导入到上面指定的 CustomerRentals/dB
目录的。
新的 RDB to XML Mapping Wizard:创建 RDB to XML Mapping 会话
我们需要先创建一个 RDB to XML Mapping 会话,之后才能创建映射。在扩展名为 .rmx
的文件中将存储有关该映射会话的信息,包括源表、目标 DTD 文件、所创建的任何映射以及连接条件。我们要保留有关已创建的任何映射的信息,以便在将来可以容易的重新装入或修改,对此这个文件是必需的。我们要做完下面这些步骤来创建最初的 RDB to XML Mapping 会话。
- 启动新的 RDB to XML Mapping Wizard
- 命名 RDB to XML Mapping 会话
- 选择映射类型
- 选择源 RDB 表
- 选择目标 DTD 文件
- 选择目标 DTD 文件的根元素
1. 启动新的 RDB to XML Mapping Wizard
现在我们要创建 RDB to XML Mapping 会话。在 Application Developer 中:
- 在屏幕顶端菜单中,选择 File => New => Other。打开名为
New
的窗口。 - 选择左边的 XML。
- 选择右边的 RDB to XML Mapping。
- 单击 Next。将打开 Specify New RDB to XML Mapping 会话页面。
2. 命名 RDB to XML Mapping 会话
在本页面上,我们将指定会话名称,以及我们想要的创建会话文件的位置。
- 选择 CustomerRentals文件夹(这个文件夹是早创建好的)。
- 指定文件名
CustomerRentals.rmx
。 - 单击 Next。
3. 选择映射类型
利用 RDB to XML Mapping 工具把关系数据映射成 XML 数据的方法有两种,一种方法是通过 RDB 表映射(RDB Table Map),另一种方法是 SQL 语句映射(SQL Statement Map)。这两种映射方法都使用 DAD 文件表示映射,但是使用的是不同的标记。
RDB 表映射把 RDB 列映射成为 XML 数据。可选的连接条件皆可指定。如果您只想要提取或存储数据库表中的信息,这种方法是有用的。利用 RDB 表映射创建的 DAD 文件可以用于分解 XML 文件并把它存成关系数据,也可用于取出关系数据并利用它来合成 XML 文件。
SQL 语句映射取出 SQL 语句并允许用户把执行 SQL 语句得到的结果列映射到 XML 属性和元素。如果您有复杂的查询并想表示成 XML 数据,使用这种方法是有用的。这些 SQL 语句得是使用 Application Developer 的 SQL Builder 创建的,如 第 2 部分中所示。RDB 表映射和 SQL 语句映射之间的关键区别是:SQL 语句映射只能用于取出关系数据并利用它来合成 XML 文件,反之则不行。
对于这个示例而言,我们将使用 RDB 表映射。
- 选择 RDB Table to XML Mapping。
- 单击 Next。
4. 选择源 RDB 表
在本页面上,我们选择 RDB 表,我们将映射这个表中的列。对这个示例来说,我们感兴趣的表有三个:CUSTOMERS、VIDEOS 和 RENTALS。
图 1. Source RDB Tables 页面
- 扩展
CustomerRentals/dB
下的目录树(我们早先把数据库导入这里)。 - 选择 CUSTOMERS。
- 按住 Ctrl,选择 RENTALS。
- 按住 Ctrl,选择 VIDEOS。应该只突出显示我们想要的三个表。
- 单击 Next。
5. 选择目标 DTD 文件
我们需要指定一个 DTD,源 XML 文件和目标 XML 文件都会符合它。如果您还没有把 DTD 文件( CustomerRental.dtd
)导入到 CustomerRental/dtd
文件夹中,那么请您选中 Import按钮现在导入。
图 2. 目标 DTD 文件页面
- 选择 CustomerRental.dtd。
- 单击 Next。
6. 选择目标 DTD 文件的根元素
在此,我们需要选择目标 DTD 文件的根元素。使用它将允许我们用 XML 格式来表示 DTD 文件,从而我们可以把 RDB 表列映射到 XML 文档的特定元素和属性。
- 选择 CustomerRentals。
- 单击 Finish。
现在我们已创建了一个会话,它将把 RDB 映射到 XML。该会话将会在 RDB to XML Mapping Editor 中打开。
使用 RDB to XML Mapping Editor
我们将要在 RDB to XML Mapping Editor 中做完所有的工作。在这里,我们将完成下列任务:
单击 CustomerRentals.rmx
选项卡,您将会看到两个窗格,如下面图 3 中所示。
图 3. 映射前的 RDB to XML Mapping 视图
左边的窗格标题是 Tables,表示 RDB 表中所有可以被映射的列。在目前情况下,我们会看到 CUSTOMERS、RENTALS 和 VIDEOS 表及其所有列。
右边的窗格标题是 XML, 其中展示的是 DTD 文件 CustomerRentals.dtd
的 XML 表示,只要选择 CustomerRentals作为根元素就会创建这个文件。
除 RDB to XML Mapping 视图之外,还有另外两个视图: Outline 视图,在该视图中可以看到当前的所有映射,以及 Overview 视图,在该视图中可以看到 XML 文档的摘要视图以及已经被映射到 XML 文档的元素和属性的所有内容。
在顶端菜单条中,有一个菜单项 Mapping
展示了特定于 RDB to XML Mapping 工具的功能。
图 4. Mapping 菜单
在工具条上,另外还有两个图标: 图标可以让您生成 DAD 文件,而
图标允许您 指定连接条件。
1. 创建映射
在 RDB to XML Mapping 视图下,我们可以定义关系数据与 XML 元素及属性之间的映射。要创建从 CUSTOMERS.CUST_ID
RDB 列到 CustomerRentals/Customer
元素下的 ID
XML 属性的映射,请执行下面的操作:
- 在 Tables 窗格中选中
CUSTOMERS
表下面的 CUST_ID列。 - 在 XML 窗格中选中
CustomerRentals/Customer
元素下的 ID属性。 - 右键单击出现上下文菜单,并选择 Create Mapping。
图 5. RDB to XML Mapping 视图上下文菜单
现在,我们已经在 CUST_ID
列和 CustomerRentals/Customer
元素的 ID
属性之间创建了映射。您将会看到这一映射被同时列入了 Outline 视图和 Summary 视图。如果您仔细看一下 RDB to XML Mapping 视图,您会注意到 CUST_ID
列和 ID
属性旁边的小箭头,表示这几项是已经映射好的。当我们 生成 DAD 文件时,这一映射信息就会反映在生成的 DAD 文件中,DB2 XML Extender 还可以用它把 XML 文件合成为关系数据或把关系数据分解为 XML 文件。
我们总共需要为这个示例创建五个映射:
- Table CUSTOMERS 列
ID
到Customer
元素下的属性ID
。 - Table CUSTOMERS 列
NAME
到Customer
元素下的属性Name
。 - Table RENTALS 列
DATE
到Rental
元素下的属性Date
。 - Table RENTALS 列
VID_ID
到Rental
元素下的属性Vidid
。 - Table VIDEOS 列
TITLE
到Rental
元素下的元素VideoName
。图 6. 映射后的 RDB to XML Mapping 视图
2. 指定连接条件
由于在我们的示例中不止一个表,我们需要为这些表指定连接条件。连接条件用来指定一个表中的哪一列应该与另外一个表中的列匹配。如果没有指定两个表之间的连接条件,那么将会返回包含这两个表的所有可能组合的结果集。这样就很可能会返回不正确的结果,比如可能会返回无效的行。对于我们的示例,我们需要指定 CUSTOMERS 和 RENTALS 表之间以及 RENTALS 和 VIDEOS 表之间的连接条件。
如果您单击 Generate DAD file按钮就会有不止一个源表而且没有指定连接条件,那么将出现一条警告消息,该消息提示用户添加连接条件或在没有连接条件的情况下继续。
要指定连接条件,请单击工具条上的 Edit Join Conditions 按钮。打开的将是一个包含表的窗口,我们可以在此指定想连接的列。在目前的情况下,我们想要连接 CUSTOMERS 表中的 CUST_ID
列与 RENTALS 表中的 CUST_ID
列。
图 7. Edit Join Conditions 页面
添加 CUSTOMERS.CUST_ID
和 RENTALS.CUST_ID
的连接条件的步骤:
- 选择第一列的 CUSTOMERS.CUST_ID。“=”会被填入第二列。该字段不可编辑,因为“=”是这一列唯一可能的值。
- 选择第三列的 RENTALS.CUST_ID。
现在,我们已经成功的创建了连接条件。如果我们需要再添加一个连接条件,那么就继续到下一行并重复这些步骤。第四列将会被自动填入 "AND." 这个词。 AND
列不可编辑,而且如果不再需要的话会被删除。
对于这个示例,我们还需要在 RENTALS.VID_ID
和 VIDEOS.VID_ID
之间创建连接条件。重复上述步骤创建该连接条件。Edit Join Conditions 页面看上去应该与上面图 7 相仿。
如果您想要删除一个连接条件,只需选中该行,单击右键并选择 Remove Join Condition。
一旦创建好了合适的连接条件,请单击 Finish。
3. 生成 DAD 文件和测试功能库
在创建了所有的映射而且指定了所有的连接条件之后,就该生成 DAD 文件了。在工具条上单击 Generate DAD file图标来启动 Generate DAD file 向导。
指定 DAD 文件名
Generate DAD 文件向导中出现的第一个页面是 Specify DAD File Name 页面。我们要在这里指定将要生成的 DAD 文件的位置及文件名。
- 选择我们早就创建好的
CustomerRentals/testharness
文件夹。 - 指定
CustomerRentals.dad
的文件名。
如果我们只对生成 DAD 文件感兴趣,那么我们单击 Finish就可以了。但是由于我们想要指定封闭标记,还想要生成测试功能库,所以请单击 Next。
指定封闭标记
指定封闭标记是一个选择项,它允许我们指定封闭整个文档的标记。这在我们要合成 XML 的情况下是很有用的。XML 文档的顶部元素包含 PCDATA 或属性,而且这个 PCDATA 或属性的值可以有多个。在这种情况下,由于我们有多个顶部元素,可能会有多个 XML 文件作为输出而被生成。封闭标记选择项允许方便的指定一个用来封闭结果的标记,所以将只返回一个 XML 文档。在选择了这一选择项的情况下,存储 XML 功能将不使用生成的 DAD 文件。
对于我们的情况,不需要指定封闭标记。请单击 Next。
生成测试功能库
测试功能库的目的在于提供操作系统特定的命令行文件,这些命令行文件将 使 XML Extender 可以使用 DB2 数据库,并对 DAD 文件进行处理以利用关系数据生成 XML 或者把 XML 数据分解为关系数据。
为了生成测试功能库,请选择 Generate Test Harness复选框,并完成下列步骤。
- 在 Folder 域中,浏览
CustomerRentals/testharness
文件夹并选中它。 - 现在请提供环境变量的值。这些环境变量包含有 实际执行测试功能库的目的机器上的特定路径信息。这并不一定要和目前运行 Application Developer 的是一样的机器或操作系统。
- 将 DB2 SQLLIB 目录的位置填入
SQLLIB
环境变量。 - 将 DB2 XML Extender 目录填入
DB2EXTENDER
环境变量。通常这个目录中都会包含dxx
(即,Windows 系统上的e:/dxx
或是 Linux 系统上的/home/db2inst1/dxx
)。 - 将您想要放入生成的 XML 文件的位置填入
XMLDIR
环境变量。这和storeXML
将要寻找源 XML 文件的位置是一样的。这一目录的存在必须先于实际执行测试功能库。
- 将 DB2 SQLLIB 目录的位置填入
- 现在请选择目的平台。目的平台是实际执行测试功能库文件的平台。这一点之所以非常重要,是因为它将在生成的测试功能库文件中确定特定于操作系统的信息,比如文件分隔符和访问环境变量的方式。
- 请选择 Windows。(如果您要在 Linux 系统上运行测试功能库的话,请选择 UNIX®。)
- 单击 Finish生成测试功能库文件。
生成的测试功能库文件将会在 Destination Folder 域中指定的目录中。可以在 Application Developer 中打开 DAD 文件,也可进行编辑。对生成的 DAD 文件进行的更改仅局限于 DAD 文件本身,不会反映在 RDB to XML Mapping 会话文件中。因此,下一次重新生成 DAD 文件时,以前所做的任何更改都不会再反映出来。
图 8. Generate Test Harness 页面
使 XML Extender 可以使用 DB2
我们需要先启用数据库对 XML 的支持,然后我们才能利用 DB2 XML Extender 在 DB2 中保存并检索 XML 文档。如 DB2 XML Extender 文档中所述,这将会:
- 创建所有的用户定义类型(user-defined type,UDT)和用户定义函数(user-defined function,UDF)。
- 创建控制表并把 XML Extender 所要求的必要的元数据填入。
- 创建 db2xml 模式并指定必要的特权。
对于我们来说,启用数据库对 XML 的支持是在测试功能库文件 retrieveXML
和 storeXML
中完成的。想要更多有关细节的信息,以及如何手工启用数据库对 XML 的支持的信息,请参考 DB2 XML Extender 文档。
运行测试功能库
到生成测试功能库的目录: CustomerRentals/testharness
。在执行任何测试功能库文件之前,请确保数据库已经启动。
运行安装(setup)文件
在 Windows 系统上,请在命令行 shell 运行 setup.bat
。该文件设置其它文件使用的环境变量。在 Windows 系统上运行 setup.bat
之后,会出现一个初始化的 DB2 shell。其它所有的测试功能库文件都需要从这个 shell 中运行。
在 Linux 系统上,为了初始化环境,您需要在命令行 shell 中引用 setup
。其它所有的测试功能库文件都必须在这个 shell 中运行。
运行 updateDTD_REF 文件
如果您需要启用验证,或想要把 DTD 文件插入 DB2XML.DTD_REF
表中,那请运行 updateDTD_REF
文件。要启用验证,您会需要手工修改 DAD 文件,把 VALIDATION
标记变成 YES
。缺省情况下,它的值为 NO
。对生成的 DAD 文件所做的任何更改都不会在 RDB to XML Mapping 会话文件中有所反映,也不会在将来生成的任何 DAD 文件中体现。
对于我们的情况,您不需要运行这个命令。
运行 retrieveXML 文件retrieveXML
文件将会用于 使 DB2 XML Extender 可以使用 DB2 数据库,以及检索关系数据并按照 DAD 文件中定义的映射把关系数据存储在 XML 文件中。
启用数据库的结果以及结果 XML 数据都将会显示在屏幕上。结果 XML 数据也可以写到 XMLDIR
中的文件中,这个文件可以和会话文件同名,只是扩展名为 .xml
。在我们的示例中,将把这个文件叫做 CustomerRental.xml
。如果返回的是多个 XML 文件,只有第一个会被写入 XMLDIR
。
在 Windows 上,从运行 setup.bat
创建的 DB2 shell 运行 retrieveXML.bat
文件。
在 Linux 上,要在与引用 setup
一样的命令行 shell 中运行 retrieveXML.sh
。
运行使用我们的 DTD 的 retrieveXML
的样本结果 XML 文件将会保存在 XMLDIR
中,文件名为 CustomerRental.xml
,类似于下面的清单 2。
清单 2.
<?xml version="1.0"?> <!DOCTYPE CustomerRental PUBLIC "CustomerRentalId" "CustomerRental.dtd"> <CustomerRental> <Customer Name="John Doe" ID="500"> <Rental Date="2000-05-25" Vidid="100"> <VideoName>The Adventures of Kernighan and Ritchie</VideoName> </Rental> <Rental Date="2000-05-25" Vidid="101"> <VideoName>The taming of the Foo</VideoName> </Rental> </Customer> <Customer Name="Jane Doe" ID="501"> <Rental Date="2000-06-01" Vidid="100"> <VideoName>The Adventures of Kernighan and Ritchie</VideoName> </Rental> </Customer> <Customer Name="Bob Smith" ID="502"> <Rental Date="2000-10-10" Vidid="104"> <VideoName>Bar Trek 4 The Voyage Home Directory</VideoName> </Rental> <Rental Date="2000-10-11" Vidid="104"> <VideoName>Bar Trek 4 The Voyage Home Directory</VideoName> </Rental> <Rental Date="2001-02-05" Vidid="105"> <VideoName>High RISC</VideoName> </Rental> </Customer> <Customer Name="Roberta Smith" ID="503"> <Rental Date="2000-09-01" Vidid="102"> <VideoName>Take out the Garbage Collection</VideoName> </Rental> </Customer> </CustomerRental>
运行 storeXML 文件storeXML
文件将会用于 使 DB2 XML Extender 可以使用 DB2 数据库,并把 XML 元素和属性中的数据保存在 RDB 表中。它还会在插入行之前删除表中的所有行。这个文件会从 XMLDIR
目录取出输入 XML 文件。它会寻找和会话文件同名但扩展名为 .xml
的文件。在我们的示例中,它会寻找一个名为 CustomerRental.xml
的文件。您可以使用随该示例提供的 CustomerRental.xml
文件,或者您也可以使用运行 retrieveXML
的结果作为输入。请把文件 CustomerRental.xml
复制到您早先在 XMLDIR
环境变量中指定的目录。
在 Windows 上,从运行 setup.bat
创建的 DB2 shell 运行 storeXML.bat
文件。
在 Linux 上,要在与引用 setup
一样的命令行 shell 中运行 storeXML.sh
。
要验证存储操作是否正确工作:
- 请手工操作数据库核对您预计应当有的数据,或者
- 请先运行
retrieveXML
文件,接着复制结果 XML 文件,运行存储操作后再运行检索操作,并把结果 XML 文件同原来的文件进行比较。
总结
在本文中,您已经看到如何使用 RDB to XML Mapping Editor 来:
- 创建一个 RDB Mapping 会话文件。
- 将 RDB 列映射至 XML 元素和属性.
- 指定表的连接条件。
- 生成 DAD 文件。
- 生成测试功能库。
- 运行测试功能库以使 XML Extender 可以使用 DB2 数据库,并从数据库数据创建 XML 文件。
- 运行测试功能库以使 XML Extender 可以使用 DB2 数据库,并把 XML 数据保存在关系表中。