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