spring 持久层封装
 (1) jdbc in spring
 Spring对JDBC进行了良好的封装,通过提供相应的模板和辅助类,在相当程度上降低了JDBC操作的复杂性。
 并且得益于Spring良好的隔离设计,JDBC封装类库可以脱离Spring Context独立使用,也就是说,
 即使系统并没有采用Spring作为结构性框架,我们也可以单独使用Spring的JDBC部分(spring-dao.jar)
 来改善我们的代码。
 
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//jdbcTemplate.update("UPDATE user SET age = 10 WHERE id = 'erica'");
jdbcTemplate.update(
 "UPDATE user SET age = ? WHERE id = ?",
 new PreparedStatementSetter() {
  public void setValues(PreparedStatementSetter ps)
  throws SQLException {
   ps.setInt(1, 18);
   ps.setString(2, "erica");
  }
 }
);

大量采用了callback的机制.
jdbcTemplate.update(...)
jdbcTemplate.query(...)
jdbcTemplate.call(...)

1. 代码控制的事务管理
简单配置事务,然后在代码中使用TransactionTemplate.


2. 参数化配置的事务管理
采用proxy模式,简单!!!!

(2)hibernate in spring
与上面JDBC中的配置相对比,区别主要在于:
1. SessionFactory的引入
Hibernate中通过SessionFactory创建和维护Session。Spring对
SessionFactory的配置也进行了整合,无需再通过Hibernate.cfg.xml对
SessionFactory进行设定。
SessionFactory节点的mappingResources属性包含了映射文件的路径,list
节点下可配置多个映射文件。
hibernateProperties节点则容纳了所有的属性配置。
可以对应传统的Hibernate.cfg.xml文件结构对这里的SessionFactory配置
进行解读。
2. 采用面向Hibernate的TransactionManager实现:
org.springframework.orm.hibernate.HibernateTransactionManag
er

public class UserDAO extends HibernateDaoSupport implements IUserDAO
{
   public void insertUser(User user) {
      getHibernateTemplate().saveOrUpdate(user);
   }
}
(3)ibatis in spring
对比之前的JDBC和Hibernate配置,可以看到:
1. sqlMapClient节点
SpringFrameWork Developer’s Guide Version 0.6
类似SessionFactory之与Hibernate,这里我们引入了针对ibatis SqlMap的
SqlMapClientFactoryBean配置。SqlMapClient对于ibatis的意义类似于Session
与Hibernate以及Connection与JDBC,这里的sqlMapClient节点实际上配置了一
个sqlMapClient的创建工厂类。
configLocation属性配置了ibatis映射文件的名称。
2. transactionManager节点
这里我们的transactionManager配置与之前JDBC示例中相同,都采用了
DataSourceTransactionManager,这与Hibernate有些差异。
3. userDAO节点
对应的,UserDAO需要配置两个属性,sqlMapClient和DataSource,
sqlMapClient将从指定的DataSource中获取数据库连接。
其他配置基本上与JDBC示例中相同,这里就不加赘述



public class UserDAO extends SqlMapClientDaoSupport implements
IUserDAO {
   public void insertUser(User user) {
      getSqlMapClientTemplate().update("insertUser", user);
   }
}