getHibernateTemplate
轉載: http://www.cnblogs.com/JemBai/archive/2011/01/17/1937413.html
SSH的項目中,使用getHibernateTemplate 與 getSession有什麼的區別?優點與缺點是什麼,謝謝回答!
主要是想了解一下這兩個關於事物這一塊有什麼不同?謝謝!
而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);
}
}
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 ;
}