ITEEDU

使用 JdbcTemplate

在 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时在程式的 撰写流程上会有什么样的改进:

•      UserDAO.java
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提供了编程式与宣告式的交易管理功 能,大大的简化了持久层程式的复杂度,并提供了 更好的维护性。