简介
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。
本文是讨论与 Application Developer 一起提供的 XML 工具的系列文章的第 2 部分。 第 1 部分讨论了如何使用 WebSphere Studio Application Developer 开发 XML Schema。本文是这个系列的第 2 部分,它介绍 Application Developer 提供的数据库查询支持。在本文中,您将学习如何使用 Application Developer 的 SQL Builder 创建 SQL 语句。我将用一个样本语句来演示如何使用 SQL Builder 在 SELECT 语句中包含表别名、列别名、数据库函数表达式、CASE 表达式和分组子句。
使用 SQL Builder 创建 SQL 语句
在本文中,我们使用一个关于一家音像店的数据库。数据库保存的数据涉及顾客、库存、录像带租金以及雇员。音像店应用程序要用到查询,该查询允许雇员查找特定顾客所租录像带的名称以及应该在星期几归还。该查询包括两个联接、一个查询条件(where 子句)和一个 group by 子句。这个 SQL 语句还需要一个 CASE 表达式、一个函数和一个主机变量来获得有关星期几的信息并在运行时替换顾客姓名。我们将完成下列步骤以创建这个查询。
- 连接到数据库然后导入本地副本
- 创建新的 SELECT 语句
- 将表添加到语句中
- 添加表别名
- 指定结果列
- 添加列别名
- 创建联接
- 创建查询条件
- 添加 group by 子句
- 执行并运行这个 SQL 查询
1. 连接到数据库然后导入本地副本
要连接到数据库然后获得本地副本:
- 在 WebSphere Studio Application Developer 中,通过选择 Perspective =>Open =>Data切换到 Data 透视图。
- Data 透视图打开后,在 DB Explorer 视图的 New Connection弹出菜单中启动 Database Connection 向导。
- 在 Database Connection 向导中(请参阅下面的图 1),提供连接的详细信息。在 Connection name域中,输入 VideoStore,然后在 Database域中输入 VIDEOS。输入用户标识和密码以及 JDBC 信息。单击 Finish。此时创建的 VideoStore 连接出现在 dB Explorer 视图中。
图 1. Database Connection 向导
- 要将数据库导入到工作区并在本地使用它,在 dB Explorer 视图中展开 VideoStore连接以查看 VIDEOS 数据库。从数据库的弹出菜单选择 Import to Folder。此时将打开 Import 对话框。
- 在 Import 对话框的 Folder域中,输入 VideoStoreProject。当提示创建项目时,选择 Yes。
- 从 dB Explorer 视图切换到 Data 视图,在树型目录中展开 VideoStoreProject项目及其下面的项。VIDEOS 数据库现在作为 VideoStoreProject 的一部分出现。
2. 创建新的 SELECT 语句
可以使用 Data 视图中 Statements文件夹上的弹出菜单添加 Select、Insert、Delete、Update、With 和 FullSelect 语句。我们将为 VIDEOS 数据库创建一个 Select 语句。要创建新的语句:
- 在 Statements文件夹上单击鼠标右键,然后选择 New =>Select Statement。在出现的对话框中将语句命名为 customerRentals。单击 OK。
- 此时将在 SQL Builder 中为您创建并打开 Select 语句,如下面的图 2 所示。
图 2. 在 SQL Builder 中创建和打开的 Select 语句
SQL Builder 由四个主视图组成:outline 视图、source 视图、graph 视图和 design 视图。outline 视图(图 2 的左下方)显示正在处理的语句。对于较复杂的语句(如 With 和 FullSelect),outline 视图显示该语句的结构,如 subselect 和公共表表达式。 source 视图(右上方)显示正在构建的语句的 SQL 源代码。graph 视图(source 视图的下方)显示已被添加到语句中的表和表中的列。design 视图(右下方)随正在编辑的语句而更改,它用来填写语句子句的详细信息。您将在本文看到使用这些视图的更详细信息。
我们创建的 Select 语句已经在 SQL Builder 中打开,因此我们将继续在那里构造它。请注意我们在本文中将只创建一个 Select 语句。可以使用 source、graph 和 design 视图以同样的方式用 SQL Query builder 创建 Insert、Delete、Update、FullSelect 和 With 等 SQL 语句。
3. 将表添加到语句中
我们将向 customerRentals 查询语句中添加三个表。要做到这一点:
- 在 Data 视图的 VIDEOS数据库树型目录中展开 WSAXML 模式。您将看到数据库的表。请参阅下面的图 3。
图 3. 在 Data 视图中列出的数据库表
- 将表 VIDEOS、RENTALS和 CUSTOMERS拖到 SQL Builder 的 graph 视图中。您将看到表出现在此视图中。注意 SQL 源代码已经更改。
图 4. SQL Builder 中的 graph 视图
4. 添加表别名
在添加表时或添加表后,可以使用 graph 视图中表上的弹出菜单添加表别名。在这个视图里,还可以使用表上的弹出菜单删除表或在表之间创建联接。还可以通过拖放操作创建联接。我马上就要讲如何将联接添加到语句中。
我们将把 V 作为 VIDEOS 的别名,R 作为 RENTALS 的别名而 C 作为 CUSTOMERS 的别名添加,步骤如下:
- 在 graph 视图的 VIDEOS表上单击鼠标右键。
- 从弹出菜单选择 Update alias。
- 在对话框中,输入 V 作为该表的别名。
- 单击 OK。
- 观察 graph 视图中 VIDEOS 表上显示的别名和 source 视图中 VIDEOS 表中的“AS V”。
- 重复上述步骤添加数据库 RENTALS 和 CUSTOMERS 的别名。
5. 指定结果列
接下来,我们要指定在查询结果中显示哪些列。我们将简单地包含其中的两个列并给第三个结果列添加 CASE 表达式。在 graph 视图中将列 VIDEOS.TITLE 和 CUSTOMERS.NAME 添加到结果列的集合中,步骤如下:
- 在 V 表的 WSAXML.VIDEOS.TITLE列名旁单击复选框。
- 在 C 表的 WSAXML.CUSTOMERS.NAME列名旁单击复选框。
- 查看 source 视图以确保列都被添加到 SQL 源代码中。
创建 CASE 表达式
查询结果集合的第三个列将是列表达式的结果。音像店数据库以 DATE 格式存储录像带的归还日期。DATE 格式需要转换成包含有关星期几信息的字符串。数据库函数将从日期给出一个对应于星期几的整数。我们将使用 CASE 表达式给函数求值,然后将函数返回的整数转换成星期几的字符串(即:1 在查询结果中将变成“Sunday”)。我们将在 Expression Builder 中完成以下步骤:
- 启动 Expression Builder。
- 创建简单类型 CASE 表达式。
- 添加 DAYOFWEEK 函数,由 CASE 表达式为其求值。
- 添加 WHEN 子句生成 CASE 表达式的结果。
启动 Expression Builder
我们将从 design 视图中的 Columns 选项卡启动 Expression Builder:
图 5. Design 视图中 Columns 选项卡的情形
在 Column列的第三行中,从表中单元格的下拉菜单选择 Build Expression选项。此时将打开 Expression Builder。
创建简单类型 CASE 表达式
使用 Expression Builder:
- 在 Expression Builder 第一页上的 expression types 列表中,选择创建 CASE - Search or simple type 表达式的选项。单击 Next。
- 在下一页上,选择创建 Simple-When-Clause类型的 CASE 表达式的选项。单击 Next。您现在将看到 Expression Builder 的 Simple Type Case Page:
图 6. Expression Builder 的 Simple Type Case Page
添加 DAYOFWEEK 函数,由 CASE 表达式为其求值。
要从 DATE 列获得有关星期几的信息,我们将使用 DAYOFWEEK 函数。该函数返回一个对应于星期几的整数。在下一节中,您将看到如何向 CASE 表达式添加 WHEN 子句以将整数映射到字符串。要将 DAYOFWEEK 函数添加到 CASE 表达式:
- 在该页面顶部的 CASE下拉列表中,选择 Build function expression选项。
- Function Builder Page 在一个单独的对话框中打开,并有详细信息要填写。请参阅下面的图 7。
图 7. Function Builder Page
- 在 Function Builder Page 上,选择 Date and time函数类别。
- 从 Date and Time 的函数列表选择 DAYOFWEEK函数。
- 从 DAYOFWEEK 函数说明列表选择 DAYOFWEEK(DATE) => INTEGER函数说明。
- 函数说明显示该函数需要一个参数。在参数表的 Value 列中,使用下拉组合框选择 WSAXML.RENTALS.DATE列。
- 在对话框底部复查函数的语法。
- 单击 Finish继续构造 CASE 表达式。这个函数现在显示在 Expression Builder 的 Simple Type CASE Page 顶部的 CASE 下拉框中。
现在我们将完成 CASE 表达式的余下部分。
添加 WHEN 子句以生成 CASE 表达式的结果
接下来,我们需要向 CASE 表达式添加七个 WHEN 子句(一个子句对应一星期中的一天)以将 DAYOFWEEK 函数返回的整数值转换成字符串。针对所有的七个子句,需要填写 WHEN 子句表(完成后的结果在下面图 8 中显示),如下所示:
图 8. WHEN 子句表
- 单击 Add WHEN Clause按钮添加第一个 WHEN 子句。
- 在 Expression列下的第一行的表单元格中单击,然后输入整数 1。
- 在 Result Expression列下的第一行的表单元格中单击,然后输入字符串 "Sunday"。
- 对上述步骤再重复六次,每次对应一星期中的一天。
- 在该页的底部预览 CASE 表达式。
- 单击 Finish关闭 Expression Builder。完成的 CASE 表达式出现在 design 视图 Columns 选项卡列表达式的列表中,还出现在语句源代码中。
6. 添加列别名
在 customerRentals SQL 语句中,我们将为 CASE 列表达式添加列别名。这可以在 SQL Builder 的 design 视图的 Columns 选项卡中完成,步骤如下:
- 单击 design 视图的 Columns选项卡。
- 单击 CASE 列表达式旁的 Alias列,然后输入 DUEDAY。
- 检查 source 视图,您将看到 CASE 表达式后的列别名“AS DUEDAY”。在执行该语句时,这个别名将作为列标题出现在结果表中。
Columns 视图现在看起来如下:
图 9. 添加了列别名后的 Columns 视图
7. 创建联接
本查询需要两个联接。这个查询需要将表 RENTALS 和 CUSTOMERS 内匹配 CUST_ID 列值的项匹配起来。然后,RENTALS 和 VIDEOS 的录像带标识(VID_ID)也需要和结果行匹配。创建联接如下:
- 将 CUST_ID列从 RENTALS表拖放到 CUSTOMERS中的 CUST_ID列。此时将在两列之间出现联接的连接符。
- 对表 RENTALS和 VIDEOS的 VID_ID列重复相同的过程。
- 查看 source 视图观察源代码中的联接:
WHERE
V.VID_ID = R.VID_ID
AND R.CUST_ID = C.CUST_ID
|
- 在 graph 视图中,您将发现两个联接都已创建:
图 10. graph 视图显示两个联接都已创建
- 您可以在 graph 视图的连接符上单击鼠标右键,然后从菜单选择 Specify Join Type来更改联接类型(即:从缺省的内联接改为左联接、右联接和完全外联接)。
8. 创建查询条件
接下来,查询需要查询条件以便只抽取具有我们需要的顾客姓名的结果行。通过使用 design 视图中的 Conditions 选项卡将条件添加到查询。
- 单击 Conditions选项卡可以看到条件表。
- 单击 Column列,然后从组合框选择 WSAXML.VIDEOS.TITLE。
- 单击 Operator列,然后选择“=”运算符。
- 单击 Value列,然后输入 :custName。冒号后面跟变量名是表示变量的 SQL 语法,当执行查询时该变量将由一个值替代。在下面有关执行语句的一节中,您将看到这在测试期间是如何完成的。该变量也可以是从 Java™ 应用程序中传递的参数。这也在稍后描述。
- Conditions 视图看起来如图 11 所示。
图 11. 添加查询条件后的 Conditions 视图
9. 添加 group by 子句
我们将首先按星期几,然后按标题,最后按顾客姓名给查询分组。要在 SQL Builder 中创建 group by 子句,在 design 视图中使用 Groups选项卡。除了可以在这个视图中创建简单的 group by 子句之外,还可以使用列表达式、嵌套组、分组集(仅在 DB2 中)、ROLLUP 以及 CUBE 分组函数(在 Oracle 和 DB2中)在查询结果中创建高级分组。要为 customerRentals 查询添加 group by 子句,请执行以下步骤:
- 在 design 视图中单击 Groups选项卡。
- 在 Column表中,从第一行的下拉菜单选择 Build expression。此时出现 Expression Builder。
- 选择创建 Function 表达式。按照和添加 CASE 表达式中的 DAYOFWEEK 函数相同的方法完成 Function Builder Page。或者,在 source 视图中,可以从 CASE 表达式复制 DAYOFWEEK 函数,然后粘贴到 group by 子句。当完成输入函数之后,单击 Finish返回到 Groups 选项卡。您将在 Column 表中看到创建的函数。
- 在表的第二和第三行中,从下拉菜单选择 WSAXML.VIDEOS.TITLE和 WSAXML.CUSTOMERS.NAME列。这样 group by 子句就完成了。Groups 视图现在看起来如下:
图 12. 添加了 group by 子句后的 Groups 视图
现在查询就完成了。它在 SQL Builder 中看起来如下:
图 13. 在 SQL Builder 中看到的完成的查询
10. 执行和运行 SQL 查询
在把 SQL 查询合并到音像店应用程序以前,需要测试它以确保它返回正确的结果。我们可以使用 SQL Builder 做到这一点,步骤如下:
- 单击 SQL Builder 的 source 视图以启用 SQL 菜单。选择 SQL =>Execute。
- 复查 Execute SQL Statement 对话框顶部的语句。单击 SQL statement 域下面的 Execute按钮。
- 此时将打开 Specify Variable Values 对话框,提示输入已经添加到顾客姓名语句的主机变量值。将这个值从缺省的 NULL 改为“John Doe”。按 Enter接受该值,然后单击 Finish关闭此对话框。
- 您将看到查询结果显示在 Execute SQL Statement 对话框的底部。这个对话框的一部分在图 14 中显示。
图 14. 在 Execute SQL Statement 对话框中显示的查询结果
- 复查完查询结果之后,单击 Close关闭 Execute SQL Statement 对话框。
结束语
WebSphere Studio Application Developer 提供 XML 与关系数据之间的紧密集成。在本文中,我讨论了 Application Developer 提供的很多 SQL 相关支持。这种支持在 XML 开发过程中将非常有用。您已经看到如何使用 Application Developer 来:
- 在 SQL Builder 中构建 SQL 查询,包括联接、表达式、条件和组。
- 对数据库执行 SQL 查询并传递查询的主机变量。
在本系列的下一篇文章中,您将学习如何:
- 从 SQL 查询和其它 XML 相关文件(XSL、DTD、XML Schema 和查询模板文件)生成 XML。
- 使用在 servlet 中生成的查询模板、DTD 和 SQLToXML 类库,在运行时动态地从 SQL 查询生成 XML。
- 使用样本 servlet 将这个 servlet 从 Web 项目部署到 WebSphere Application Server。
- 和其它 XML 工具一起使用 SQL Builder。例如,您将学习如何使用 RDB 到 XML 的映射工具创建 DAD 文件,以及如何对 DADX Web 服务使用 DAD 文件。