在 DataSource 注入 中, UserDAO中直接使用JDBC 来实作insert()与find() 方法,当中要处理 Connection的取得、Statement的建立、例外的 处理、Statement的关闭、Connection的关闭等, 对于一个基本的JDBC存取,这些流程是大同小异的,每一次您都必须作这样的流程着实令 人厌 烦,Spring 提供了 org.springframework.jdbc.core.JdbcTemplate 类别,它被设计为执行绪安全 (Thread‐safe),当中所 提供的一些操作方法封装了类似以上的流程,例如DataSourceDemo专案 中的UserDAO类别可以简单的使用JdbcTemplate来改写, 要建立JdbcTemplate的实例,必须要有 一个DataSource物件作为建构时的物件:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
来改写一下DataSource 注入 中UserDAO的内容实作,您可以看到使用JdbcTemplate时在程式的 撰写流程上会有什么样的改进:
package onlyfun.caterpillar; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; public class UserDAO implements IUserDAO { private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } public void insert(User user) { String name = user.getName(); int age = user.getAge().intValue(); jdbcTemplate.update("INSERT INTO user (name,age) "+ "VALUES('" + name + "'," + age + ")"); } public User find(Integer id) { List rows = jdbcTemplate.queryForList("SELECT * FROM user WHERE id=" + id.intValue()); Iterator it = rows.iterator(); if(it.hasNext()) { Map userMap = (Map) it.next(); Integer i = new Integer(userMap.get("id").toString()); String name = userMap.get("name").toString(); Integer age = new Integer(userMap.get("age").toString()); User user = new User(); user.setId(i); user.setName(name); user.setAge(age); return user; } return null; } }
只要改写UserDAO就可以了,其它的程式与设定档都不用变动,Spring的JdbcTemplate一如其名称 所示的,主要是藉由 Template Method模式 来实现JDBC的处理流程封装。
Spring的Jdbc封装等功能基本上可以独立于Spring来使用,除了JdbcTemplate之外,Spring还提供了 其它的Template 类别,像是对Hibernate、JDO、ibatis等的Template实现,另外,在交易处理方面, Spring提供了编程式与宣告式的交易管理功 能,大大的简化了持久层程式的复杂度,并提供了 更好的维护性。