集成SpringFramework和DataStudio

pureQuery 是包含在 Data Studio 中的 IBM 新开发平台,用于开发 Java™ 数据库访问应用程序。它简单的 API 和集成工具不仅提高了数据访问开发人员的效率,还鼓励遵守编码最佳实践以获得更好的应用程序性能。Spring 是一个开源的 Java/J2EE 应用程序框架,它提供了更高级的数据访问特性,比如事务管理、资源管理以及 Data Access Object 层次结构。如果将它与 pureQuery 集成起来,将带来更简单的应用程序开发与维护体验。本教程引导您构建具有 Spring Framework 数据访问特性的 pureQuery 应用程序。

关于本教程

本教程向您展示如何在 IBM Data Studio 中一步一步创建各种 Java 数据访问应用程序。分两种情况讲述:一种是有 pureQuery 或 Spring 支持,一种情况是没有 pureQuery 或 Spring 支持。

学习以下内容:

使用 IBM Data Studio Developer 创建一个简单的 Java 数据访问应用程序,并通过它访问 DB2 示例数据库

使用 Spring 的 JdbcTemplate 实现相同的 Java 数据访问应用程序

使用 Spring 通过以下步骤创建一个 Data Studio pureQuery 应用程序:

生成一个 pureQuery 应用程序,并运行它

向生成的 pureQuery 应用程序添加 Spring 数据访问支持

通过 pureQuery 的静态绑定特性运行这个应用程序

先决条件

本教程面向以下数据库编程人员:对 Data Studio 或 Eclipse 环境有一定的了解,但不一定要熟悉 pureQuery 或 Spring Framework。

系统要求

本教程需要您安装以下产品:

带有 SAMPLE 数据库的 IBM DB2 9.5 for Linux, UNIX and Windows

IBM Data Studio Developer V 1.1.x。也可以使用从网上下载的 IBM Data Studio 1.1.x,但它不支持将在最后一部分讲述的静态绑定

Spring Framework 2.0.x with Dependencies

IBM pureQuery 和 Spring 集成工具箱

一个简单的 Java 数据访问应用程序

本小节展示如何在 Data Studio 内部创建一个 JDBC 应用程序,然后通过它访问示例 DB2 数据库中的帐户 “ACT” 表。它利用 DAO(Data Access Object)设计模式,在这种模式下,业务应用程序对接口而不是具体对象进行编码。因此,这实现了业务逻辑和数据访问的分离。

需要的 4 个文件:

一个保存查询所返回数据的 bean 类,它代表帐户业务对象 —— Account.java

声明应用程序可以调用的数据访问方法的 DAO(Data Access Object)接口 —— AccountData.java

实现在 DAO 接口中定义的方法的 DAO 实现 —— AccountDao.java

调用方法的应用程序 —— AccountApp.java

如图 1 所示,应用程序通过调用在接口中声明的方法访问数据库。

图 1. 结构流程

bean 类

bean 类有三个数据字段(actno、actkwd 和 actdesc),它们代表了来自 ACT 表的三个列。清单 1 展示了保存查询所返回数据的 bean 类,它代表帐户业务对象。

清单 1. Account.java

package com.test;public class Account {protected short actno;protected String actkwd;protected String actdesc;public Account () {super();}public Account (short actno, String actkwd, String actdesc) {super();this.actno = actno;this.actkwd = actkwd;this.actdesc = actdesc;}public short getActno() {return actno;}public void setActno(short actno ) {this.actno = actno;}public String getActkwd() {return actkwd;}public void setActkwd(String actkwd ) {this.actkwd = actkwd;}public String getActdesc() {return actdesc;}public void setActdesc(String actdesc ) {this.actdesc = actdesc;}}

DAO 接口

DAO 接口声明了可以通过应用程序调用的方法。在清单 2 所示的简单示例中只定义了一个方法 getAccounts(),这个方法可以获取所有来自 ACT 表的行。

清单 2. AccountData.java

package com.test;import java.util.List;public interface AccountData {public String sql = "SELECT * from act";public List getAccounts();}

DAO 实现

通过 DAO 实现可以实现在接口中声明的方法。在这个示例中,只有一个需要实现的方法 getAccounts(),但仍然需要添加模板 JDBC 代码,以:

获得数据库连接

捕获 SQL 异常

遍历结果集

清空资源,比如连接、语句或结果集

清单 3 展示了 getAccounts() 方法的 DAO 实现。

清单 3. AccountDao.java

package com.test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.List;public class AccountDao implements AccountData{public List getAccounts(){List actList = new ArrayList();Account act = null;try{Connection con = getConnection();Statement st = con.createStatement();ResultSet rs = st.executeQuery(sql);while (rs.next()){act = new Account(rs.getShort("ACTNO"),rs.getString("ACTKWD"),rs.getString("ACTDESC") );actList.add(act);}rs.close();st.close();con.close();return actList;}catch (SQLException sqle){throw new RuntimeException(sqle);}}private Connection getConnection() throws SQLException {String driver = "com.ibm.db2.jcc.DB2Driver";String url  = "jdbc:db2://localhost:50000/sample";try{Class.forName(driver);}catch(Exception e){e.printStackTrace();}// Replace USERNAME and PASSWORD with your own dataConnection con =   DriverManager.getConnection(url,"USERNAME","PASSWORD");return con;}}

应用程序

应用程序首先实例化一个 DAO 对象,然后调用 getAccounts() 方法并将结果输出到控制台。清单 4 展示了在实例化 DAO 对象之后调用 getAccounts() 方法的应用程序。

清单 4. AccountApp.java

package com.test;import java.util.List;public class AccountApp {public static void main(String [] args) {AccountData accountData = new AccountDao();List actList = accountData.getAccounts();for (Account act : actList)System.out.println(" ACTNO=" + act.getActno() +" ACTKWD="+ act.getActkwd() + " ACTDESC="+act.getActdesc());}}

构建并运行应用程序

按照以下步骤创建一个 Data Studio 项目,然后通过这个项目构建并运行应用程序。

创建一个 Data Studio Java 项目。

在菜单栏上导航到 File > New > Project > Java Project。将项目名称字段改为 DSJdbc。除非特别指明,否则本文中全部采用默认值。

将 JDBC 支持添加到项目。

右键单击项目 DSJdbc 并选择 Build Path > Configure Build Path…

选择 Library 选项卡并单击 Add External Jars…,添加下面的 DB2 JDBC 驱动程序文件。

DB2 INSTALL%/ SQLLIB/java/db2jcc.jar

%DB2 INSTALL%/ SQLLIB/java/db2jcc_license_cu.jar

将源文件添加到项目。

可以从本教程中剪切粘贴 4 个 Java 文件,或者下载本教程的源文件(参见 下载)。

右键单击项目 DSJdbc 并选择 New > Package。在名称字段处输入 com.test。

右键单击刚才创建的包并选择 Import … > General > File System。更改目录字段,使它的位置与源文件相同,然后选择前面创建的 4 个 Java 文件。您所构建的项目应该类似于图 2。

图 2. 项目 DSJdbc

运行应用程序:

右键单击 AccountApp.java > Run As > Java Application,将看到类似于图 3 控制台窗口中的结果。

图 3. 运行应用程序的结果。

创建一个简单的 Java 数据访问应用程序

虽然在 Data Studio 内部创建 Java 数据访问代码非常直观,但在每次实现中都会出现一些重复的代码,比如获得连接或捕获异常的代码。还有可能出现函数调用结束时资源仍然占用的情况。

用 Spring JdbcTemplate 实现相同的应用程序

通过 Spring JdbcTemplate 的支持可以减少冗余代码,同时也获得 Spring 管理特性带来的好处。图 4 给出了新的结构流程。

没有更改的内容:

所有用户定义接口。

更改的内容:

DAO 实现文件已经变得非常小——已将所有重复的 JDBC 代码移至 Spring。

由于没有必要分配和发布 JDBC 资源,不会发生资源泄漏。

不必解释 SQLExceptions。Spring 已经帮助 DB2 这些主要 DBMS 完成了这个工作。

这个应用程序并不局限于特定的 DBMS 或数据访问实现。现在它由可以编辑的配置文本文件控制。

将要重用来自最后一节的 Bean 和接口类。需要添加或修改下面的组件:

一个更加简单的 DAO 实现 —— AccountDao.java

稍微修改应用程序,使它可以加载 Spring 配置文件,而不是直接实例化 DAO 对象 —— AccountApp.java

能够动态地配置数据源和 DAO 实现的配置文件 —— applicationContext.xml,jdbc.properties。

如图 4 所示,应用程序只加载了配置文件,并且让 Spirng 实例化 DAO 实现。Data Source 配置(比如 DBMS 供应商或连接信息)已经从 DAO 实现代码中移出,并放置到 Spring 配置文件中。

图 4. Spring 结构的流程

DAO 实现

模板 JDBC 代码已经替换成 Spring JdbcTemplate。因此,不再需要通过实现代码来获得连接、捕获 SQL 异常、遍历结果集或清理资源。一个简单的 queryForList(String sql) 调用返回一个映射列表。可以通过 RowMapper 将每个返回的行映射到 bean 类。清单 5 给出了一个使用 Spring JdbcTemplate 的 DAO 实现。

清单 5. AccountDao.java

package com.test;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.jdbc.core.support.JdbcDaoSupport;public class AccountDao extends JdbcDaoSupport implements AccountData{@SuppressWarnings("unchecked")public List getAccounts(){JdbcTemplate daoTemplate = this.getJdbcTemplate();RowMapper mapper = new RowMapper (){public Object mapRow(ResultSet rs,int rowNum) throws SQLException {Account act = new Account();act.setActno(rs.getShort("ACTNO"));act.setActkwd(rs.getString("ACTKWD"));act.setActdesc(rs.getString("ACTDESC"));return act;}};return daoTemplate.query(sql, mapper );}}

应用程序

应用程序需要加载 Spring 配置文件,从而启动 Spring 框架、获取由该配置定义的 DAO,然后像前面一样调用 getAccounts() 在接口中声明的方法。清单 6 展示了这个应用程序。

清单 6. AccountApp.java

package com.test;import java.util.List;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AccountApp {public static void main(String[] args) {ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});AccountData dao = (AccountData) ac.getBean("ACT_DAO");List actList = dao.getAccounts();for (Account act : actList )System.out.println(" ACTNO=" + act.getActno() +" ACTKWD="+ act.getActkwd() + " ACTDESC="+act.getActdesc());}}

Spring 配置文件

Spring 使用配置文件初始化并启动框架。本教程使用一个简单的配置文件 “applicationContext.xml”(参见清单 7),从属性文件中获取数据源信息,以及定义这个应用程序所使用的 DAO 实现类。清单 7 是一个 Spring 配置文件示例。

清单 7. applicationContext.xml

"http://www.springframework.org/dtd/spring-beans-2.0.dtd">class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">jdbc.propertiesdestroy-method="close">value="${jdbc.driverClassName}" />

清单 8 是一个示例连接属性文件。

清单 8. jdbc.properties

jdbc.driverClassName=com.ibm.db2.jcc.DB2Driverjdbc.url=jdbc:db2://localhost:50000/sample:traceFile=C:/sample.log;traceLevel=-1;traceFileAppend=true;jdbc.username=USERNAMEjdbc.password=PASSWORD

构建并运行应用程序

根据类似于前面的 “构建并运行应用程序” 小节 的步骤创建一个 Data Studio 项目并运行应用程序。

首先需要下载 Spring Framework 2.0.x with Dependencies,然后解压缩到本地目录。本教程使用的是 Spring 2.0,但您也可以使用 Spring 2.5 并相应地更改设置。

根据类似于第一小节的说明创建一个新项目 DSSpring 并添加 JDBC 支持。

将 Spring 库添加到该项目。

右键单击 DSSpring 项目并选择 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

根据前一小节的说明,将 4 个 Java 源文件添加到 com.test 包下的“DSSpring”项目。

将配置文件添加到项目。右键单击 DSSpring project 并选择 Import … > File System。将字段 “from directory” 更改为配置文件所在的位置。选择 applicationContext.xml 和 jdbc.properties,然后单击 Finish。图 5 展示了这个项目所需要的 Spring 库和配置文件。

运行应用程序。在 DSSpring 项目中,右键单击 MyApp.java > Run As > Java Application。将在控制台窗口中看到类似于前面小节的结果(图 3)。

图 5. 项目 DSSpring

将事务管理添加到应用程序

如本教程开始时所述,除了数据访问之外,Spring 也支持其他特性,比如事务管理。将清单 9 中的代码添加到配置文件 applicationContext.xml,启用 Spring 的声明性事务管理。

清单 9. 事务管理器

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

使用 pureQuery 和 Spring Framework

这一节首先展示如何使用 pureQuery 自动生成在前面小节中需要手动创建的代码,然后介绍如何将 Spring 支持添加到 pureQuery 应用程序。最后,将演示一个独特的 pureQuery 特性:静态绑定。

创建一个 pureQuery 应用程序

创建一个连接 DB2 示例数据库的数据库连接

启动 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 对话框。

图 6. 示例图

创建一个带有 pureQuery 支持的 Java 项目

从菜单栏导航到 File > New > Project,然后选择 Java Project。输入 PQSpring 作为项目名称。跟前面一样,除非特别指定,否则一律使用默认值。单击 Finish 完成新项目的创建。

右键单击刚才创建的项目并选择 Add pureQuery Support . . . 。选择刚才创建的连接 — Sample — 作为现有的连接,然后单击 Finish 完成这个过程。

创建 pureQuery 代码

展开 Database Explorer 内部的示例数据库,查找 ATC 表,如图 7 所示。

图 7. ACT 表

右键单击 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 所示。

图 8. 为表生成 pureQuery 代码

单击 Next 移动到 Bean Fields 对话框,然后选择 Next 再次导航到 SQL Statements 对话框。在这里,只需生成可以从 ACT 表选择所有行的方法,因此选择 Generate the SQL statements specified below 单选按钮,然后选择 Select all rows 复选框,如图 9 所示。

图 9. SQL 语句

单击 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 选项卡里面。

图 10. 配置

将 Spring 支持添加到 pureQuery 应用程序

pureQuery 和 Spring 集成工具箱简介

这个集成工具箱已经通过 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 支持添加到项目

根据“构建并运行应用程序”小节中的步骤,将 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。

图 11. 项目 PQSpring

Spring 配置文件

如 前面小节 所述,spring 配置文件 applicationContext.xml 和 jdbc.properties 需要添加到这个项目。在这种情况下,如果您使用相同的连接信息,则 jdbc.properties 就保持不变。需要更改 applicationContext.xml 中的 DAO 定义,表明这是新的 DAO 实现。同样,用一个 propertyConfigurer bean 来表明属性文件的位置。这样做的好处是 DBA 只需要更改属性文件以连接到其他数据源,而不需要更改应用程序本身。

清单 10 是 Spring 配置文件的一个示例,它使用了来自 pureQuery 和 Spring 集成工具箱的类。

清单 10. applicationContext.xml

"http://www.springframework.org/dtd/spring-beans-2.0.dtd">class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">jdbc.propertiesdestroy-method="close">value="${jdbc.driverClassName}" />factory-method="forName">   class="org.springmodules.purequery.PdqAnnotatedMethodFactory"factory-method="getData">

应用程序

接下来将创建一个新的应用程序 SpringTest.java,并通过它加载 Spring 配置文件和调用 DAO 方法。将清单 11 中的代码添加到 com.test 包下的项目。

清单 11:SpringTest.java

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 fileClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(new  String[] {"applicationContext.xml"});//Get the DAO objectAccountData accountData = (AccountData)ac.getBean("ACT_DAO");//Call the getAccounts() methodIterator Acts = accountData.getAccounts();//Print out the resultswhile (Acts.hasNext ()) {Account o = Acts.next();System.out.println("Act No=" + o.getActno() + " key="+o.getActkwd() + " desc="+o.getActdesc()  );}}}

运行应用程序

右键单击 SpringTest > Run As > Java Application。输出结果显示在控制台窗口内,类似于图 12。

现在,已经将 Sring 支持添加到一个现有的 pureQuery 应用程序,但不需要更改任何 pureQuery 代码。您也可以根据“将事务管理添加到应用程序”小节 的步骤,为这个项目添加事务控制。

图 12. 来自 PQSpring 的输出

结合使用静态 SQL 和 Spring

pureQuery 静态绑定特性使您能够将动态的 SQL 替换为静态的 SQL,从而通过一个基于包的授权机制改善运行时性能并实现更高的安全性。通过 pureQuery,使用静态或动态的 SQL 已经变成一个运行时决策,而不是设计时决策。按照下面的步骤静态运行应用程序。

右键单击 PQSpring 项目并选择 Bind pureQuery Application。输出控制台会显示:

Bind pureQuery Application invoked for project PQSpring.

pureQuery Bind completed successfully for com.test.AccountData.

为 SpringTest.java 创建一个运行时配置。将下面的信息添加到 VM 参数:

-Dpdq.executionMode=STATIC

现在的配置应该类似于图 13。应用并运行这个配置。目前的配置使用的是静态 SQL。

图 13. PQSpring 运行配置

结束语

IBM Data Studio 的 pureQuery 特性大大地提高了数据库编程生产力,同时也改善了运行时性能。通过使用 pureQuery 和 Spring 集成工具箱,可以将 Spring Framework 的特性添加到 pureQuery 应用程序,比如,声明性事务管理、错误处理以及资源管理。

本文配套源码

自己战胜自己是最可贵的胜利。

集成SpringFramework和DataStudio

相关文章:

你感兴趣的文章:

标签云: