Spring整合Hibernate后,为Hibernate的DAO提供了两个工具类:HibernateTemplate和HibernateDaoSupport

HibernateTemplate
HibernateTemplate是Spring提供的一个就Hibernate访问持久层技术而言、支持Dao组件的一个工具。HibernateTemplate提供持久层访问模板,应用HibernateTemplate无须实现特定的接口,它只需要提供一个sessionFactory的引用就可以执行持久化操作。
该模板无需打开session及关闭Session。它只要获得SessionFactory的引用,就可以打开Session,并在持久化访问结束后关闭Session,程序开发只需要完成持久层逻辑,通用的CRUD操作由HibernateTemplate完成.

HibernateDaoSupport
HibernateDaoSupport同样也是Spring提供的、为Hibernate访问数据库的DAO组件:该类主要提供如下两个方法,方便DAO的实现:

1>public final HibernateTemplate getHibernateTemplate()
2>public final void setSessionFactory(SessionFactory sessionFactory)


其中setSessionFactory方法用来接收Spring的ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实例,getHibernateTemplate方法则用来生成HibernateTeplate模板对象来完成数据库访问。
同样常用HibernateDaoSupport中的getSession方法来获取Session对象对数据库进行操作,相对HibernateTemplate对象而言,HibernateDaoSupport应用更加灵活。

 

配置方案——Spring+hibernate访问数据库有以下几种方法:

 

1>注入SessionFactory

 

在spring配置文件中,对Dao注入sessionFactory,如下所示
配置文件相关配置如下:

1. <bean id="manageEmpDaoImpl"
2. class="com.cyou.lms.emp.manageemp.dao.impl.ManageEmpDaoImpl">
3. <property name="sessionFactory" ref="sessionFactory" />
4. </bean>


 Dao编码如下:

 

1. public class ManageEmpDaoImpl extends HibernateDaoSupport implements
2. public void
3. this.getHibernateTemplate().save(emp);  
4.        }  
5. public
6. return null;  
7.        }  
8.    }


这里的sessionFacotry注入不是给类的,而是给继承HibernateDaoSupport类的sessionFactory,在上面源码中可以看到。这样编写的一个好处就是我们不再需要关心关闭、是否连接成功等问题。主要是很方便。但是这个不好就是java只支持单继承,所以唯一的继承给了HibernateDaoSupport有点可惜。而且也没有必要这样做。

在实际使用中,如果持久层继承HibernateDaoSupport的话,那么每个持久层的类,都需要注入SessionFactory,非常麻烦,

有一个便捷方法: 可以自己写一个类,继承HibernatedaoSupport,把SessionFactory或者HibernateTemplate注入到这个类中,持久层继承此类。

 

2>注入HibernateTemplate

 

这种方法本质上跟上面的sessionFacotry一样,只不过进行了一层包装,好处就是Dao中的类就不用再继承那个HibernateDaoSuport了,不过要先配置好HibernateTemplate:
配置文件如下所示:

1. <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
2. <property name="sessionFactory" ref="sessionFactory" />
3. </bean>
4. <bean id="manageEmpDaoImpl" class="com.cyou.lms.emp.manageemp.dao.impl.ManageEmpDaoImpl"/>


 

DAO编码如下所示:

1. public class ManageEmpDaoImpl implements
2. @Resource
3. private
4. public void
5. this.hibernateTemplate.save(emp);  
6.     }  
7. public
8. return null;  
9.     }  
10. }

 

3> 注入jdbcTemplate这种配置是使用Spring对JDBC的封装,而非Hibernate。即不加载Hibernate容器,直接使用Spring对JDBC的封装来操作数据库

第一种配置:给DAO类注入数据源dataSource
配置如下:

 

1. <bean id="userManageImpl" class="com.nos.business.springJDBC.impl.UserManageImpl">
2. <property name="dataSource" ref="dataSource" />
3. </bean>

 

DAO编码如下所示:


HibernateTemplate和HibernateDaoSupport_Source

1. public class UserManageImpl implements
2. private
3.       
4. @Resource(name="dataSource")  
5. public void
6. this.jdbcTemplate = new
7.     }  
8.   
9. @Override
10. public void
11.     {  
12. "insert into user_info(name,sex) values(?,?)", new
13.     }  
14. }


 第二种配置:直接给Dao类注入JdbcTemplate
  配置如下:

1. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
2. <property name="dataSource" ref="dataSource" />
3. </bean>

 DAO编码如下所示:


1. public class UserManageImpl2 implements
2. @Resource
3. private
4.   
5. @Override
6. public void
7.     {  
8. "insert into user_info(name,sex) values(?,?)", new
9.     }  
10. }