用 Spring JdbcTemplate 实现相同的应用程序
通过 Spring JdbcTemplate 的支持可以减少冗余代码,同时也获得 Spring 管理特性带来的好处。
- 没有更改的内容:
- 所有用户定义接口。
- 更改的内容:
- DAO 实现文件已经变得非常小——已将所有重复的 JDBC 代码移至 Spring。
- 由于没有必要分配和发布 JDBC 资源,不会发生资源泄漏。
- 不必解释 SQLExceptions。Spring 已经帮助 DB2 这些主要 DBMS 完成了这个工作。
- 这个应用程序并不局限于特定的 DBMS 或数据访问实现。现在它由可以编辑的配置文本文件控制。
将要重用来自最后一节的 Bean 和接口类。需要添加或修改下面的组件:
- 一个更加简单的 DAO 实现 —— AccountDao.java
- 稍微修改应用程序,使它可以加载 Spring 配置文件,而不是直接实例化 DAO 对象 —— AccountApp.java
- 能够动态地配置数据源和 DAO 实现的配置文件 —— applicationContext.xml,jdbc.properties。
应用程序只加载了配置文件,并且让 Spirng 实例化 DAO 实现。Data Source 配置(比如 DBMS 供应商或连接信息)已经从 DAO 实现代码中移出,并放置到 Spring 配置文件中。
模板 JDBC 代码已经替换成 Spring JdbcTemplate。因此,不再需要通过实现代码来获得连接、捕获 SQL 异常、遍历结果集或清理资源。一个简单的 queryForList(String sql) 调用返回一个映射列表。可以通过 RowMapper 将每个返回的行映射到 bean 类。清单 5 给出了一个使用 Spring JdbcTemplate 的 DAO 实现。
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<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 );
}
}
|
应用程序需要加载 Spring 配置文件,从而启动 Spring 框架、获取由该配置定义的 DAO,然后像前面一样调用 getAccounts() 在接口中声明的方法。清单 6 展示了这个应用程序。
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<Account> actList = dao.getAccounts();
for (Account act : actList )
System.out.println(" ACTNO=" + act.getActno() +
" ACTKWD="+ act.getActkwd() + " ACTDESC="+act.getActdesc());
}
}
|
Spring 使用配置文件初始化并启动框架。本教程使用一个简单的配置文件 “applicationContext.xml”(参见清单 7),从属性文件中获取数据源信息,以及定义这个应用程序所使用的 DAO 实现类。清单 7 是一个 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_DAO" class="com.test.AccountDao">
<property name="dataSource">
<ref bean="DB2DataSource" />
</property>
</bean>
</beans>
|
清单 8 是一个示例连接属性文件。
jdbc.driverClassName=com.ibm.db2.jcc.DB2Driver jdbc.url=jdbc:db2://localhost:50000/sample:traceFile=C:/sample.log; traceLevel=-1;traceFileAppend=true; jdbc.username=USERNAME jdbc.password=PASSWORD |
如本教程开始时所述,除了数据访问之外,Spring 也支持其他特性,比如事务管理。将清单 9 中的代码添加到配置文件 applicationContext.xml,启用 Spring 的声明性事务管理。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="DB2DataSource"/> </bean> |
本实例需要用到如下jar:
- spring.jar
- commons-logging.jar
- commons-dbcp.jar
- commons-pool.jar

被折叠的 条评论
为什么被折叠?



