Hibernate反射DAO模式_第1頁
Hibernate反射DAO模式_第2頁
Hibernate反射DAO模式_第3頁
Hibernate反射DAO模式_第4頁
Hibernate反射DAO模式_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Hibernate反射DAO模式在持久層框架中,如果我們要像簡單的JDBC連接數(shù)據(jù)庫那樣寫一個通用的Dao方法的話,那么把JDBC簡單的業(yè)務邏輯搬到hibernate持久層框架中,當然是不可能的,這里主要的問題就在于hibernate持久層框架中,因為它不是像JDBC那樣簡單的增刪改查的編寫,而是要針對實體類映射配置文件來對照數(shù)據(jù)庫表字段進行操作,而且操作是面向?qū)ο蟮牟樵?,不是簡單的sql語句的查詢,這樣我們的通用DAO模式就不能是簡單的JDBC思路了。試想,項目底層的通用DAO接口方法,是適用于所有實體類對象應用的,而且數(shù)據(jù)庫讀取的所有實體類集合也是一個通用的類模型。這樣,和簡單的JDBC模

2、式不同的基礎(chǔ)上,hibernate通用的DAO模型,就需要我們利用反射序列化的技術(shù)機制來完成。因此無論是插入的類對象和讀取的類模型信息,通過反射序列化來獲取。具體的操作流程如下:首先,在我們的通用DAO接口中,體現(xiàn)出所有通用功能的方法名外,我們需要定義的另外一個技術(shù),就是泛型類編程模式,我們需要給類加上類型,也就是給類加上泛型模式編程。另外,在泛型中,需要定義兩個屬性,1是給類加一個繼承序列化的變量,和給主鍵ID繼承的一個序列化。因此反射DAO接口如下:public interface IGenericDao<T extends Serializable,ID extends Seria

3、lizable>另外,所有的功能方法名,隨之也會有所更改,例如我們添加一條信息時候,之前的參數(shù)是需要具體的實體類對象,而現(xiàn)在則是泛型的屬性為實體類的對象,如下:public T create(T entity);返回值也是一樣。因此在通用DAO接口如圖:具體的類實現(xiàn)中,除了實現(xiàn)該通用的DAO接口外,還需要自身的泛型編程和繼承HibernateDaoSupport父類,因此實現(xiàn)類的方法名為:public class GenericHibernateDao<T extends Serializable,ID extends Serializable> extends Hibern

4、ateDaoSupport implements IGenericDao<T, ID>。因此例如在插入數(shù)據(jù)時候?qū)崿F(xiàn)類代碼則是:Overridepublic T create(T entity) return (T) this.getHibernateTemplate().save(entity);這里反射序列化的類對象T,作為通用Dao接口的實現(xiàn)類實體類通用類型,但是在實現(xiàn)類的查詢中,也就是讀取中,我們也需要獲取一個反射序列化的通過實體類對象模型,這就是需要反射的Class實例對象了,因此在通用DAO接口的實現(xiàn)類中,我們需要創(chuàng)建一個Class實例對象,這個對象中我們需要的泛型類型是

5、反射序列化的實體類對象模型T,因此這個對象為Class<T> persistentClass;但是我們還需要這個Class實例對象來獲取反射序列化的具體對象模型,這就需要我們通過java底層對象類型來獲取了,具體為this.persistentClass=(Class<T>)(ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()0;這里面1. getClass().getGenericSuperclass():獲取java最底層類對象 2. (ParameterizedT

6、ype)getClass().getGenericSuperclass():轉(zhuǎn)換為可序列化類型3. .getActualTypeArguments()0 反射出第一個參數(shù)對象信息,也就是獲取類泛型中T extends Serializable4. (Class<T>):強轉(zhuǎn)為當前類對象通過這些復雜的過程,我們可以獲取反射序列化的具體Class實例類型,這樣就可以通過該Class實例來獲取具體查詢的結(jié)果集合。因此實現(xiàn)類的代碼大致如下:public class GenericHibernateDao<T extends Serializable,ID extends Serial

7、izable> extends HibernateDaoSupport implements IGenericDao<T, ID> Class<T> persistentClass;public GenericHibernateDao() / 強轉(zhuǎn)為當前類對象,轉(zhuǎn)換為可序列化類型, 獲取java最底層類對象 反射出第一個參數(shù)對象信息 this.persistentClass=(Class<T>) (ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()0;

8、public Class<T> getPersistentClass() return persistentClass;public void setPersistentClass(Class<T> persistentClass) this.persistentClass = persistentClass;Overridepublic T create(T entity) return (T) this.getHibernateTemplate().save(entity);Overridepublic void delete(ID id) /刪除通用方法 參數(shù)為要

9、刪除的實體類對象System.out.println("IDD "+id);this.getHibernateTemplate().delete(this.findById(id);Overridepublic void update(T entity) this.getHibernateTemplate().update(entity);Overridepublic T findById(ID id) return this.getHibernateTemplate().get(persistentClass, id);Overridepublic List<T&g

10、t; findAll() return this.getHibernateTemplate().loadAll(persistentClass);Overridepublic List<T> findByObject(String hql, Object param) return this.getHibernateTemplate().find(hql, param);Overridepublic PageBean findByPageBean(final String hql,final Object param,final int currentpage,final int

11、pageSize) return this.getHibernateTemplate().execute(new HibernateCallback<PageBean>() Overridepublic PageBean doInHibernate(Session session)throws HibernateException, SQLException /創(chuàng)建pagebean對象PageBean pb=new PageBean();/通過Query對象來獲取所需要頁的數(shù)據(jù)Query qu=session.createQuery(hql);/賦值參數(shù)if(param.lengt

12、h>0)for (int i = 0; i < param.length; i+) qu.setParameter(i, parami);/為Query對象,賦值從第幾行到第幾行參數(shù),也就是最大最小頁數(shù)值qu.setFirstResult(currentpage-1)*pageSize);qu.setMaxResults(pageSize);/給PageBean對象,賦值list參數(shù)pb.setData(qu.list();/獲取總行數(shù) qu=session.createQuery("select count(*) "+hql.substring(hql.toL

13、owerCase().indexOf("from");/賦值獲取總行數(shù)參數(shù)if(param.length>0) for (int j = 0; j < param.length; j+) qu.setParameter(j, paramj); /Pagebean賦值總行數(shù)參數(shù)pb.setTotalRows(Integer.parseInt(qu.uniqueResult().toString();/Pagebean賦值當前頁參數(shù)pb.setCurrentPage(currentpage);/Pagebean賦值每頁大小參數(shù)pb.setPageSize(pageS

14、ize);/返回pagebean對象return pb;);Overridepublic void bulkUpdate(String bulk, Object param) this.getHibernateTemplate().bulkUpdate(bulk,param);Overridepublic Integer countByObject(final String hql,final Object param) return this.getHibernateTemplate().execute(new HibernateCallback<Integer>() /獲取hibernateSessionFactory接口方法 Overridepublic Integer doInHibernate(Session session)throws HibernateException, SQLException /通過HIbernateQuery方法來獲取count值Query qu=sessi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論