getHibernateTemplate用法(轉載)

getHibernateTemplate

 

轉載:  http://www.cnblogs.com/JemBai/archive/2011/01/17/1937413.html

 

SSH的項目中,使用getHibernateTemplate 與 getSession有什麼的區別?優點與缺點是什麼,謝謝回答!

懸賞分:0 - 解決時間:2008-10-7 09:42
SSH的項目中,使用getHibernateTemplate 與 getSession有什麼的區別?優點與缺點是什麼,謝謝回答!
問題補充:謝謝 451182
主要是想了解一下這兩個關於事物這一塊有什麼不同?謝謝!
最佳答案
getHibernateTemplate已經封裝好了一些基本的方法,可以直接去用,也就是template嘛,
而getSession只是獲取一個數據工廠的session,然後大部分方法都需要自己寫,加hql語句,然後用query方法執行

談不上什麼優點缺點,類似添加刪除更新這樣的可以直接用getHibernateTemplate而大部分帶條件查詢的就需要用getSession自己寫了
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
主流技術到底就是主流技術,效率就不一般。
Hibernate封裝了對數據庫的例行操作,比單純的jdbc的DAO,開發效率要高很多了。而Springframework對Hibernate的操作又進行了進一步的包裝,又將開發效率提升不少。下面的例子是Spring自己給的petclinic的樣本程序。
原來b/s架構的大量數據庫操作可以這麼輕鬆搞定。

package org.springframework.samples.petclinic.hibernate;

import java.util.Collection;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import org.springframework.samples.petclinic.Clinic;
import org.springframework.samples.petclinic.Owner;
import org.springframework.samples.petclinic.Pet;
import org.springframework.samples.petclinic.Visit;

/**
* Hibernate implementation of the Clinic interface.
*
* <p>The mappings are defined in "petclinic.hbm.xml",
* located in the root of the classpath.
*
* @author Juergen Hoeller
* @since 19.10.2003
*/

public class HibernateClinic extends HibernateDaoSupport implements Clinic {

public Collection getVets() throws DataAccessException {
return getHibernateTemplate().
find(
"from Vet vet order by vet.lastName, vet.firstName");
}

public Collection getPetTypes() throws DataAccessException {
return getHibernateTemplate().find(
"from PetType type order by type.name"
);
}

public Collection findOwners(String lastName) throws DataAccessException {
return getHibernateTemplate().
find(
"from Owner owner where owner.lastName like ?", lastName + "%"
);
}

public Owner loadOwner(int id) throws DataAccessException {
return (Owner) getHibernateTemplate().load(Owner.class, new Integer(id));
}

public Pet loadPet(int id) throws DataAccessException {
return (Pet) getHibernateTemplate().load(Pet.class, new Integer(id));
}

public void storeOwner(Owner owner) throws DataAccessException {
getHibernateTemplate().saveOrUpdate(owner);
}

public void storePet(Pet pet) throws DataAccessException {
getHibernateTemplate().saveOrUpdate(pet);
}

public void storeVisit(Visit visit) throws DataAccessException {
getHibernateTemplate().saveOrUpdate(visit);
}

}
這方法getHibernateTemplate()是什麼意思啊?
 懸賞分:0 - 解決時間:2008-3-2 09:33
有什麼作用啊?
最佳答案
HibernateTemplate 提供非常多的常用方法來完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加對命名SQL查詢的支持,也增加對分頁的支持。大部分情況下,使用Hibernate的常規用法,就可完成大多數DAO對象的CRUD操作。 下面是HibernateTemplate的常用方法簡介:
q void delete(Object entity):刪除指定持久化實例
q deleteAll(Collection entities):刪除集合內全部持久化類實例
q find(String queryString):根據HQL查詢字符串來返回實例集合
q findByNamedQuery(String queryName):根據命名查詢返回實例集合
q get(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例
q save(Object entity):保存新的實例
q saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新
q update(Object entity):更新實例的狀態,要求entity是持久狀態
q setMaxResults(int maxResults):設置分頁的大小
*********************************************

在前一篇日誌中自動生成hibernate配置文件的時候,會在dao層用到getSession()方法來操作數據庫記錄,但是他還有個方法getHibernateTemplate(),這兩個方法究竟有什麼區別呢?

1.使用getSession()方法你只要繼承 sessionFactory,而使用getHibernateTemplate()方法必須繼承HibernateDaoSupport當然包括 sessionFactory,這點區別都不是特別重要的,下面這些區別就很重要了

2.getSession()方法是沒有經過spring包裝 的,spring會把最原始的session給你,在使用完之後必須自己調用相應的close方法,而且也不會對聲明式事務進行相應的管理,一旦沒有及時 關閉連接,就會導致數據庫連接池的連接數溢出,getHibernateTemplate()方法是經過spring封裝的,例如添加相應的聲明式事務管 理,由spring管理相應的連接。

在實際的使用過程中發現的確getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()並沒有提供,這時我們用HibernateCallback 回調的方法管理數據庫.

例如如下代碼:

/**
     * 使用 hql 語句進行操作
     * @param hql HSQL 查詢語句(使用回調函數訪問外部變量,必須是final的)
     * @param offset 開始取數據的下標
    * @param length 讀取數據記錄數
    * @return List 結果集
*/
public List getListForPage ( final String hql , final int offset , final int length ) {

              List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
                            public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                                            Query query = session.createQuery ( hql ) ;
                                            query.setFirstResult ( offset ) ;
                                            query.setMaxResults ( length ) ;
                                            List list = query.list ( ) ;
                                            return list ;
                           }
               }) ;
               return list ;
}

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