使用 pureQuery 和 Spring Framework
这一节首先展示如何使用 pureQuery 自动生成在前面小节中需要手动创建的代码,然后介绍如何将 Spring 支持添加到 pureQuery 应用程序。最后,将演示一个独特的 pureQuery 特性:静态绑定。
启动 IBM Data Studio 之后,需要创建一个连接示例数据库的连接。
- 将 Database Explorer 视图添加到 Java 透视图。
导航到 Window > Show View > Other >Data,然后选择 Database Explorer。 - 创建一个连接到示例数据库的连接
展开 Database Explorer 内部的 Connections 节点,如果能够看到示例数据库, 就可以进入下一步。否则,右键单击 Database Explorer 内部的 Connections 节点并选择 New Connections . . . - 提供所需的信息,完成 New Connection 向导。
图 6 展示了 New Connection 对话框。
创建一个带有 pureQuery 支持的 Java 项目
- 从菜单栏导航到 File > New > Project,然后选择 Java Project。输入 PQSpring 作为项目名称。跟前面一样,除非特别指定,否则一律使用默认值。单击 Finish 完成新项目的创建。
- 右键单击刚才创建的项目并选择 Add pureQuery Support . . . 。选择刚才创建的连接 --- Sample --- 作为现有的连接,然后单击 Finish 完成这个过程。
创建 pureQuery 代码
- 展开 Database Explorer 内部的示例数据库,查找 ATC 表,如图 7 所示。
- 右键单击 ACT table 并选择 Generate pureQuery Code …。在 Package 字段,输入 com.test,然后在 Name 字段输入 Account。选中 Generate annotated-method interface for table、Generate test class for annotated-method interface for table 和 Include connection information in test 复选框,如图 8 所示。
- 单击 Next 移动到 Bean Fields 对话框,然后选择 Next 再次导航到 SQL Statements 对话框。在这里,只需生成可以从 ACT 表选择所有行的方法,因此选择 Generate the SQL statements specified below 单选按钮,然后选择 Select all rows 复选框,如图 9 所示。
- 单击 Finish 完成代码生成。现在,已经完成 pureQuery 应用程序,而且不需要编写任何代码。
生成的代码
下面的文件由以上的步骤自动地生成
- Account.java —— 保存来自 ACT 表的数据的 bean 类。
- AccountData.java —— 仅声明方法
getAccounts()
的接口。 - AccountDataTest.java —— 调用
getAccount()
方法的应用程序。 - AccountDataImpl.java —— 在 pureQuerysrc 文件夹下的 DAO 实现。这个文件实现在 AccountData 接口中定义的方法,并且由 pureQuery 生成器在每次更改接口时自动生成(如果开启 Project Menu 上的 “Build Automatically”)。
运行应用程序
自动生成的应用程序 AccountDataTest.java 需要一个数据库密码作为输入参数。因此,最好创建一个配置来运行这个应用程序,如图 10 所示。
- 右键单击 AccountDataTest.java > Run As > Run …
- 右键单击 Java Application > New
- 切换到 Arguments 选项卡并输入密码作为 Program 参数。现在,需要在 “YourPasswordHere” 字段为数据库输入您的个人专用密码。
- 应用并运行这个配置。ACT 表中的记录将显示在 Console 选项卡里面。
这个集成工具箱已经通过 Key MOD-415 提交到 Spring Module with Key MOD-415。就像工具箱本身所描述的一样:“这个特性需求的目标是能够将 pureQuery 和 Spring 结合使用,从而获得 Spring 的 Data 访问特性的优势,比如 Spring 事务管理、资源管理(连接)以及 Data Access Exception 层次结构”。
它包含 3 个文件:
- pureQuerySpring-samples.zip:带有文档的示例文件。
- pureQuerySpring_src.zip:源代码文件。
- spring-pdq.jar:运行时文件。
- 根据“构建并运行应用程序”小节中的步骤,将 Spring 库添加到 PQSpring 项目。
- 右键单击 PQSpring 项目并选择 Build Path>Configure Build Path . . .
- 单击 Libraries tab 并选择 Add External Jars,添加下面的 Spring 库。
- %Spring install%/dist/spring.jar
- %Spring install%/lib/jakarta-commons/commons-logging.jar
- %Spring install%/lib/jakarta-commons/commons-dbcp.jar
- %Spring install%/lib/jakarta-commons/commons-pool.jar
- 来自 pureQuery 和 Spring 集成工具箱的一个额外的库“spring-pdq.jar”也需要添加到构建路径。最后的项目应该类似于图 11。
如 前面小节 所述,spring 配置文件 applicationContext.xml 和 jdbc.properties 需要添加到这个项目。在这种情况下,如果您使用相同的连接信息,则 jdbc.properties 就保持不变。需要更改 applicationContext.xml 中的 DAO 定义,表明这是新的 DAO 实现。同样,用一个 propertyConfigurer bean 来表明属性文件的位置。这样做的好处是 DBA 只需要更改属性文件以连接到其他数据源,而不需要更改应用程序本身。
清单 10 是 Spring 配置文件的一个示例,它使用了来自 pureQuery 和 Spring 集成工具箱的类。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <!-- replaces ${...} placeholders with values from properties files --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>jdbc.properties</value> </list> </property> </bean> <!-- Define datasource --> <bean id="DB2DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- Configure DAO --> <bean id="ACT_DATA" class="java.lang.Class" factory-method="forName"> <constructor-arg value="com.test.AccountData" /> </bean> <bean id="ACT_DAO" class="org.springmodules.purequery.PdqAnnotatedMethodFactory" factory-method="getData"> <constructor-arg ref="ACT_DATA" /> <constructor-arg ref="DB2DataSource" /> </bean> </beans>
接下来将创建一个新的应用程序 SpringTest.java,并通过它加载 Spring 配置文件和调用 DAO 方法。将清单 11 中的代码添加到 com.test 包下的项目。
package com.test; import java.util.Iterator; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { public static void main(String[] args) { //Load the configuratioin file ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext( new String[] {"applicationContext.xml"}); //Get the DAO object AccountData accountData = (AccountData)ac.getBean("ACT_DAO"); //Call the getAccounts() method Iterator<Account> Acts = accountData.getAccounts(); //Print out the results while (Acts.hasNext ()) { Account o = Acts.next(); System.out.println("Act No=" + o.getActno() + " key="+o.getActkwd() + " desc="+ o.getActdesc() ); } } }