天天看點

HibernateTemplate和HibernateDaoSupport

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應用更加靈活。

hibernateTemplate的常用方法:

Øvoid delete(Object entity):删除指定持久化執行個體

ØdeleteAll(Collection entities):删除集合内全部持久化類執行個體

Øfind(String queryString):根據HQL查詢字元串來傳回執行個體集合

ØfindByNamedQuery(String queryName):根據命名查詢傳回執行個體集合

Øget(Class entityClass, Serializable id):根據主鍵加載特定持久化類的執行個體

Øsave(Object entity):儲存新的執行個體

ØsaveOrUpdate(Object entity):根據執行個體狀态,選擇儲存或者更新

Øupdate(Object entity):更新執行個體的狀态,要求entity是持久狀态

ØsetMaxResults(int maxResults):設定分頁的大小

配置方案——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編碼如下:

HibernateTemplate和HibernateDaoSupport
public class ManageEmpDaoImpl extends HibernateDaoSupport implements ManageEmpDao{
       public void addEmp(Emp emp) {
           this.getHibernateTemplate().save(emp);
       }
       public List<Emp> getEmpList() {
           return null;
       }
   }      
HibernateTemplate和HibernateDaoSupport

這裡的sessionFacotry注入不是給類的,而是給繼承HibernateDaoSupport類的sessionFactory,在上面源碼中可以看到。這樣編寫的一個好處就是我們不再需要關心關閉、是否連接配接成功等問題。主要是很友善。但是這個不好就是java隻支援單繼承,是以唯一的繼承給了HibernateDaoSupport有點可惜。而且也沒有必要這樣做。

2>注入HibernateTemplate

這種方法本質上跟上面的sessionFacotry一樣,隻不過進行了一層包裝,好處就是Dao中的類就不用再繼承那個HibernateDaoSuport了,不過要先配置好HibernateTemplate:

配置檔案如下所示:

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

DAO編碼如下所示:

HibernateTemplate和HibernateDaoSupport
public class ManageEmpDaoImpl implements ManageEmpDao {
   @Resource
    private HibernateTemplate hibernateTemplate;
    public void addEmp(Emp emp) {
       this.hibernateTemplate.save(emp);
    }
    public List<Emp> getEmpList() {
       return null;
    }
}      
HibernateTemplate和HibernateDaoSupport

3> 注入jdbcTemplate

這種配置是使用Spring對JDBC的封裝,而非Hibernate。即不加載Hibernate容器,直接使用Spring對JDBC的封裝來操作資料庫

第一種配置:給DAO類注入資料源dataSource

配置如下:

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

DAO編碼如下所示:

HibernateTemplate和HibernateDaoSupport
public class UserManageImpl implements IUserManage{
    private JdbcTemplate jdbcTemplate;
    
    @Resource(name="dataSource")
    public void setDataSource(DataSource dataSource){
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void add(UserVo vo)
    {
        jdbcTemplate.update("insert into user_info(name,sex) values(?,?)", new Object[]{vo.getName(), vo.getSex()});
    }
}      
HibernateTemplate和HibernateDaoSupport

第二種配置:直接給Dao類注入JdbcTemplate(個人偏向于這種配置)

  配置如下:

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

DAO編碼如下所示:

HibernateTemplate和HibernateDaoSupport
public class UserManageImpl2 implements IUserManage{
    @Resource
    private JdbcTemplate jdbcTemplate;

    @Override
    public void add(UserVo vo)
    {
        jdbcTemplate.update("insert into user_info(name,sex) values(?,?)", new Object[]{vo.getName(), vo.getSex()});
    }
}      
HibernateTemplate和HibernateDaoSupport

繼續閱讀