在 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提供了編程式與宣告式的交易管理功
能,大大的簡化了持久層程式的複雜度,並提供了更好的維護性。
|