IBM Data Studio 中內建的 pureQuery 是新一代 Java 資料庫存取開發平台,其簡潔的 API 與整合工具不僅大幅提升開發效率,更能引導開發者遵循最佳實踐,從而獲得更優的應用程式效能。Spring Framework 作為開源的 Java/J2EE 應用框架,提供事務管理、資源管理及 DAO 階層架構等進階資料存取特性。將兩者整合,能帶來更簡潔的應用程式開發與維護體驗。本教學將逐步引導您建置具備 Spring 資料存取功能的 pureQuery 應用程式。
本教學面向具備 Data Studio 或 Eclipse 基礎操作概念的資料庫程式設計人員,無需熟悉 pureQuery 或 Spring Framework。系統需安裝:
採用 DAO(Data Access Object)設計模式,實現業務邏輯與資料存取分離。應用程式透過介面而非具體類別操作資料庫,結構流程如下圖所示:

對應 ACT 表的三個欄位:
package com.test;
public class Account {
protected short actno;
protected String actkwd;
protected String actdesc;
// 建構子、getter/setter 方法省略...
}
package com.test;
import java.util.List;
public interface AccountData {
public String sql = "SELECT * from act";
public List<Account> getAccounts();
}
傳統 JDBC 寫法需手動管理連線、例外處理、資源釋放:
public class AccountDao implements AccountData {
public List<Account> getAccounts() {
List<Account> actList = new ArrayList<Account>();
try {
Connection con = getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
actList.add(new Account(rs.getShort("ACTNO"),
rs.getString("ACTKWD"), rs.getString("ACTDESC")));
}
// 手動關閉資源...
} catch (SQLException sqle) {
throw new RuntimeException(sqle);
}
return actList;
}
// getConnection() 方法省略...
}
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 專案「DSJdbc」,加入 DB2 JDBC 驅動程式(db2jcc.jar、db2jcc_license_cu.jar),匯入四個 Java 檔案至 com.test 套件,執行 AccountApp.java 即可在主控台看到查詢結果。

引入 Spring JdbcTemplate 後,DAO 實作大幅簡化,重複的 JDBC 範本程式碼移至 Spring 管理,消除資源洩漏風險,並自動轉換 SQLExceptions。資料來源配置外部化至 XML 檔案,達成 DBMS 無關性。

public class AccountDao extends JdbcDaoSupport implements AccountData {
@SuppressWarnings("unchecked")
public List<Account> 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);
}
}
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<Account> actList = dao.getAccounts();
// 輸出結果...
}
}
<beans>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations"><list><value>jdbc.properties</value></list></property>
</bean>
<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>
<bean id="ACT_DAO" class="com.test.AccountDao">
<property name="dataSource"><ref bean="DB2DataSource" /></property>
</bean>
</beans>
jdbc.driverClassName=com.ibm.db2.jcc.DB2Driver
jdbc.url=jdbc:db2://localhost:50000/sample
jdbc.username=USERNAME
jdbc.password=PASSWORD
建立專案「DSSpring」,除 DB2 驅動外,需加入 Spring 相關函式庫:spring.jar、commons-logging.jar、commons-dbcp.jar、commons-pool.jar。配置檔放置於專案根目錄。執行結果同純 JDBC 版本。

在 applicationContext.xml 中加入:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="DB2DataSource"/>
</bean>

AccountDataTest.java 需密碼參數,建立執行配置於 Arguments 分頁輸入密碼,執行即可查看結果。

pureQuery-Spring 整合工具箱(Key MOD-415)提供三個檔案:pureQuerySpring-samples.zip、pureQuerySpring_src.zip、spring-pdq.jar。將 Spring 函式庫與 spring-pdq.jar 加入專案建置路徑。

<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>
public class SpringTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml"});
AccountData accountData = (AccountData) ac.getBean("ACT_DAO");
Iterator<Account> Acts = accountData.getAccounts();
while (Acts.hasNext()) {
Account o = Acts.next();
System.out.println("Act No=" + o.getActno() + " key=" + o.getActkwd() + " desc=" + o.getActdesc());
}
}
}
執行 SpringTest.java 即可看到相同結果,且未修改任何 pureQuery 生成代碼。

pureQuery 靜態綁定可將動態 SQL 轉為靜態 SQL,透過套件授權機制提升效能與安全性。操作步驟:
-Dpdq.executionMode=STATIC
IBM Data Studio 的 pureQuery 大幅提升資料庫程式開發產能與執行效能。透過 pureQuery-Spring 整合工具箱,可為 pureQuery 應用程式導入 Spring 的宣告式事務管理、錯誤處理、資源管理等企業級特性,實現開發效率與執行效能的雙重提升。