zoukankan      html  css  js  c++  java
  • HibernateTemplate和HibernateDaoSupport(spring注入问题)

    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,如下所示

    配置文件相关配置如下:

    <bean id="manageEmpDaoImpl"

    class="com.cyou.lms.emp.manageemp.dao.impl.ManageEmpDaoImpl">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    Dao编码如下:

    publicclass ManageEmpDaoImpl extendsHibernateDaoSupport implementsManageEmpDao{

    publicvoid addEmp(Emp emp) {

    this.getHibernateTemplate().save(emp);

    }

    publicList<Emp> getEmpList() {

    returnnull;

    }

    }

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

    2>注入HibernateTemplate

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

    配置文件如下所示:

    <beanid="hibernateTemplate"

    class="org.springframework.orm.hibernate3.HibernateTemplate">

    <propertyname="sessionFactory"ref="sessionFactory"/>

    </bean>

    <beanid="manageEmpDaoImpl"class="com.cyou.lms.emp.manageemp.dao.impl.ManageEmpDaoImpl">

    <propertyname="hibernateTemplate"ref="hibernateTemplate"/>

    </bean>

    DAO编码如下所示:

    publicclass ManageEmpDaoImpl implementsManageEmpDao {

    privateHibernateTemplate hibernateTemplate;

    publicvoid addEmp(Emp emp) {

    this.hibernateTemplate.save(emp);

    }

    publicList<Emp> getEmpList() {

    returnnull;

    }

    publicHibernateTemplate getHibernateTemplate() {

    returnhibernateTemplate;

    }

    publicvoid setHibernateTemplate(HibernateTemplate hibernateTemplate) {

    this.hibernateTemplate= hibernateTemplate;

    }

    }

     

     

    前者代码虽然简便,但是继承了HibernateDaoSupport之后,没有办法再继承别的类了.用什么就看个人喜好了。

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

    有一个便捷方法: 可以自己写一个类(比如BaseDao),继承HibernatedaoSupport,把SessionFactory或者HibernateTemplate注入到这个类中,

    其他的持久层XXXDao类继承此BaseDao类即可。

    相应的配置文件可以这样写:

    1.用HibernateTemplate的类时的配置文件如下:

    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties" ref="hibernate-hibernateProperties"></property>
    <property name="packagesToScan" ref="hibernate-packagesToScan"></property>
    <property name="mappingLocations" ref="hibernate-mappingLocations"></property>
    </bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <bean id="baseHibernateDao" class="cn.com.ksplatform.base.dao.BaseHibernateDAO"
    parent="hibernateTemplate"></bean>

    2.使用HibernateSupportDao类时的配置文件的写法:

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    </bean>

    <bean id="baseDao" class="com.gcflower.dao.BaseDao">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>

  • 相关阅读:
    开发日记1
    探索需求2
    探索需求1
    周总结8
    周总结7
    周总结6
    周总结5
    周总结4
    周总结3
    周总结2
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/5980591.html
Copyright © 2011-2022 走看看