spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的選擇問題

轉載自:http://blog.csdn.net/zcywell/article/details/7191466



spring提供訪問數據庫的有三種方式: HibernateDaoSupport,HibernateTemplate(推薦使用),jdbcTemplate

HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplate

HibernateDaoSupport:org.springframework.orm.hibernate3.support.HibernateDaoSupport

spring如果想整合hibernate的話,首先就應該獲得SessionFactory這個類,然後再通過獲得session就可以進行訪問數據庫了

即spring提供的類HibernateDaoSupport,HibernateTemplate應該是有setSessionFactory,在使用的時候注入一下就可以了

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource" ref="dataSource"></property>
   <property name="annotatedClasses">
    <list>
     <value>com.zcy.model.User</value>
     <value>com.zcy.model.Log</value>
    </list>
   </property>
   <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.OracleDialect
    </prop>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="hibernate.show_sql">
     true
    </prop>
   </props> 
  </property>
  </bean>

對於HibernateTemplate:

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

在程序中直接用就可以了,如下

@Component("u")
public class UserDaoImpl_HibernateTemplate implements UserDao {
 private HibernateTemplate  hibernateTemplate;
 
 @Resource
 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = hibernateTemplate;
 }
 

 public void save(User user) {
  hibernateTemplate.save(user);
 }

}

對於HibernateDaoSupport: 

public final void setSessionFactory(SessionFactory sessionFactory)

public final SessionFactory getSessionFactory()

public final void setHibernateTemplate(HibernateTemplate hibernateTemplate)

public final HibernateTemplate getHibernateTemplate()

從它類裏的方法可以知道,在使用的時候只需要將sessionFactory注入給HibernateDaoSupport,然後就可以通過getHibernateTemplate

來獲得HibernateTemplate,這樣就可以使用HibernateTemplate了,就和上面使用HibernateTemplate的一樣的

(顯然這有點繞了一點彎,個人感覺還是直接使用HibernateTemplate就可以了,不過根據個人喜好或項目的需求而定)

下面是實現設計的方法:

service:

public class UserService {

 private UserDao userDao;
 
 public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
 }
   
 public void add(User user){
    userDao.save(user);
 }

dao:

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
 public void save(User user) {
    this.getHibernateTemplate().save(user);
 }

}

bean.xml:

<bean id="userService" class="com.zcy.service.UserService">
  <property name="userDao" ref="userDao"></property>
 </bean>


 <bean id="userDao" class="com.zcy.dao.impl.UserDaoImpl">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

這裏的sessionFacotry注入不是給類UserDaoImpl 的,而是給繼承HibernateDaoSupport類的sessionFactory,使用HibernateDaoSupport好處就是我們不再需要關心關閉、

是否連接成功等問題(在使用spring封裝的這些類,即HibernateDaoSupport,HibernateTemplate,jdbcTemplate,都不需要關心是否關閉,是否連接的問題,因爲spring已這些操作封裝給注入好了),

這樣用起來很方便。但是這個不好就是java只支持單繼承,所以唯一的繼承給了HibernateDaoSupport有點可惜。

另外注意的是因爲HibernateDaoSupport已經有setSessionFactory(SessionFactory sessionFactory)這個方法了,所以在UserDaoImpl 的類裏就不需要寫了,

並且HibernateDaoSupport的setSessionFactory的方法時final的,所以重寫還會報錯的。

 

對於jdbcTemplate以後再做整理吧

 

 

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):設置分頁的大小

 

HibernateDaoSupport: 

Spring爲Hibernate的DAO提供工具類:HibernateDaoASupport。該類主要提供如下兩個方法,方便DAO的實現:

1、public final HibernateTemplate getHibernateTemplate()

2、public final void setSessionFactory(SessionFactory sessionFactory)

其中setSessionFactory方法用來接收Spring的ApplicationContext的依賴注入,可接收配置在Spring的SessionFactory實例,getHibernateTemplate方法則用來更具獲得的SessionFactory產生Session,最後生成HibernateTeplate來完成數據庫訪問。

HibernateTemplate用於持久層的訪問,該模板無需打開session及關閉Session。它只要獲得SessionFactory的引用,就可以打開Session,並在持久化訪問結束後關閉Session,程序開發只需要完成持久曾邏輯,通用的CRUD操作由HibernateTemplate完成.

其實Spring+hibernate訪問數據庫有以下幾種方法:

1、注入SessionFactory

在spring配置文件中,對Dao注入sessionFactory.比較簡單。

如:

<beanid="UserInfoDao"class="com.hr2job.dao.impl.UserInfoDaoImpl">

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

</bean>

這裏的sessionFacotry注入不是給類的,而是給繼承HibernateDaoSupport類的sessionFactory,在上面源碼中可以看到。以前寫SSH程序的時候就是用這個的,因爲是不知道,這個好處就是我們不再需要關心關閉、是否連接成功等問題。主要是很方便。但是這個不好就是java只支持單繼承,所以唯一的繼承給了HibernateDaoSupport有點可惜。而且也沒有必要這樣做。

2、注入HibernateTemplate

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

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
   </bean>

非常的方便,我現在就在用這個了。其實並沒有改多少,就是曾經的sessionFactroy改成了hibernatemplate。

3、注入jdbcTemplate

這種方法適合那些不喜歡hibernate的save,delete等方法,喜歡自己寫的N人吧。有時候jdbcTemplate查詢的效率會很高。這可能是跟jdbc有關吧。

配置如下:

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

在類中set方法jdbctemplate方法就可以了,spring中的配置跟sessionFactory基本一樣。

總的感覺還是喜歡HibernateTemplate,原因就是好用,不需要寫太多的sql語句,不需要

類去繼承,只要提供一個set方法,再注入一下很方便。

發佈了86 篇原創文章 · 獲贊 13 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章