使用 Spring 创建 pureQuery 应用程序
pureQuery 是包含在 Data Studio 中的 IBM 新开发平台,用于开发 Java™ 数据库访问应用程序。它简单的 API 和集成工具不仅提高了数据访问开发人员的效率,还鼓励遵守编码最佳实践以获得更好的应用程序性能。Spring 是一个开源的 Java/J2EE 应用程序框架,它提供了更高级的数据访问特性,比如事务管理、资源管理以及 Data Access Object 层次结构。如果将它与 pureQuery 集成起来,将带来更简单的应用程序开发与维护体验。本教程引导您构建具有 Spring Framework 数据访问特性的 pureQuery 应用程序。
本教程需要您安装以下产品:
- 带有 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 集成工具箱
IBM Data Studio v1.2 下载地址:http://www.ibm.com/developerworks/downloads/im/data/?S_TACT=105AGX52&S_CMP=DWCHINA
一个简单的 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
bean 类有三个数据字段(actno、actkwd 和 actdesc),它们代表了来自 ACT 表的三个列。清单 1 展示了保存查询所返回数据的 bean 类,它代表帐户业务对象。
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 接口声明了可以通过应用程序调用的方法。在清单 2 所示的简单示例中只定义了一个方法 getAccounts()
,这个方法可以获取所有来自 ACT 表的行。
package com.test; import java.util.List; public interface AccountData { public String sql = "SELECT * from act"; public List<Account> getAccounts(); } |
通过 DAO 实现可以实现在接口中声明的方法。在这个示例中,只有一个需要实现的方法 getAccounts()
,但仍然需要添加模板 JDBC 代码,以:
- 获得数据库连接
- 捕获 SQL 异常
- 遍历结果集
- 清空资源,比如连接、语句或结果集
清单 3 展示了 getAccounts() 方法的 DAO 实现。
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<Account> getAccounts() { List<Account> actList = new ArrayList<Account>(); 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 data Connection con = DriverManager.getConnection(url,"USERNAME","PASSWORD"); return con; } } |
应用程序首先实例化一个 DAO 对象,然后调用 getAccounts()
方法并将结果输出到控制台。清单 4 展示了在实例化 DAO 对象之后调用 getAccounts() 方法的应用程序。
package com.test; import java.util.List; public class AccountApp { public static void main(String [] args) { AccountData accountData = new AccountDao(); List<Account> actList = accountData.getAccounts(); for (Account act : actList) System.out.println(" ACTNO=" + act.getActno() + " ACTKWD="+ act.getActkwd() + " ACTDESC="+act.getActdesc()); } } |
虽然在 Data Studio 内部创建 Java 数据访问代码非常直观,但在每次实现中都会出现一些重复的代码,比如获得连接或捕获异常的代码。还有可能出现函数调用结束时资源仍然占用的情况。