隨筆-10  評(píng)論-36  文章-6  trackbacks-0
          編寫Spring+Hibernate框架下的應(yīng)用,總是離不了編寫一個(gè)通用的泛型GenericHibernateDao。查閱了網(wǎng)上不少的GenericHibernateDao實(shí)現(xiàn),歸納整理為如下實(shí)現(xiàn),供后續(xù)編碼參考。

          GenericDao.java:
          package dao;

          import java.io.Serializable;
          import java.util.Collection;
          import java.util.Iterator;
          import java.util.List;
          import org.hibernate.Criteria;
          import org.hibernate.LockMode;
          import org.hibernate.criterion.DetachedCriteria;

          /**
           *
           * 
          @author lny
           
          */
          public interface GenericDao<extends Serializable, PK extends Serializable>
          {
              
          // -------------------- 基本檢索、增加、修改、刪除操作 --------------------

              
          // 根據(jù)主鍵獲取實(shí)體。如果沒有相應(yīng)的實(shí)體,返回 null。
              public T get(PK id);

              
          // 根據(jù)主鍵獲取實(shí)體并加鎖。如果沒有相應(yīng)的實(shí)體,返回 null。
              public T getWithLock(PK id, LockMode lock);

              
          // 根據(jù)主鍵獲取實(shí)體。如果沒有相應(yīng)的實(shí)體,拋出異常。
              public T load(PK id);

              
          // 根據(jù)主鍵獲取實(shí)體并加鎖。如果沒有相應(yīng)的實(shí)體,拋出異常。
              public T loadWithLock(PK id, LockMode lock);

              
          // 獲取全部實(shí)體。
              public List<T> loadAll();

              
          // loadAllWithLock() ?

              
          // 更新實(shí)體
              public void update(T entity);

              
          // 更新實(shí)體并加鎖
              public void updateWithLock(T entity, LockMode lock);

              
          // 存儲(chǔ)實(shí)體到數(shù)據(jù)庫(kù)
              public void save(T entity);

              
          // saveWithLock()

              
          // 增加或更新實(shí)體
              public void saveOrUpdate(T entity);

              
          // 增加或更新集合中的全部實(shí)體
              public void saveOrUpdateAll(Collection<T> entities);

              
          // 刪除指定的實(shí)體
              public void delete(T entity);

              
          // 加鎖并刪除指定的實(shí)體
              public void deleteWithLock(T entity, LockMode lock);

              
          // 根據(jù)主鍵刪除指定實(shí)體
              public void deleteByKey(PK id);

              
          // 根據(jù)主鍵加鎖并刪除指定的實(shí)體
              public void deleteByKeyWithLock(PK id, LockMode lock);

              
          // 刪除集合中的全部實(shí)體
              public void deleteAll(Collection<T> entities);

              
          // -------------------- HSQL ----------------------------------------------

              
          // 使用HSQL語(yǔ)句直接增加、更新、刪除實(shí)體
              public int bulkUpdate(String queryString);

              
          // 使用帶參數(shù)的HSQL語(yǔ)句增加、更新、刪除實(shí)體
              public int bulkUpdate(String queryString, Object[] values);

              
          // 使用HSQL語(yǔ)句檢索數(shù)據(jù)
              public List find(String queryString);

              
          // 使用帶參數(shù)的HSQL語(yǔ)句檢索數(shù)據(jù)
              public List find(String queryString, Object[] values);

              
          // 使用帶命名的參數(shù)的HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedParam(String queryString, String[] paramNames, Object[] values);

              
          // 使用命名的HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedQuery(String queryName);

              
          // 使用帶參數(shù)的命名HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedQuery(String queryName, Object[] values);

              
          // 使用帶命名參數(shù)的命名HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values);

              
          // 使用HSQL語(yǔ)句檢索數(shù)據(jù),返回 Iterator
              public Iterator iterate(String queryString);
              
              
          // 使用帶參數(shù)HSQL語(yǔ)句檢索數(shù)據(jù),返回 Iterator
              public Iterator iterate(String queryString, Object[] values);
              
              
          // 關(guān)閉檢索返回的 Iterator
              public void closeIterator(Iterator it);
              
              
          // -------------------------------- Criteria ------------------------------
              
              
          // 創(chuàng)建與會(huì)話無(wú)關(guān)的檢索標(biāo)準(zhǔn)對(duì)象
              public DetachedCriteria createDetachedCriteria();

              
          // 創(chuàng)建與會(huì)話綁定的檢索標(biāo)準(zhǔn)對(duì)象
              public Criteria createCriteria();

              
          // 使用指定的檢索標(biāo)準(zhǔn)檢索數(shù)據(jù)
              public List findByCriteria(DetachedCriteria criteria);
              
              
          // 使用指定的檢索標(biāo)準(zhǔn)檢索數(shù)據(jù),返回部分記錄
              public List findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults);

              
          // 使用指定的實(shí)體及屬性檢索(滿足除主鍵外屬性=實(shí)體值)數(shù)據(jù)
              public List<T> findEqualByEntity(T entity, String [] propertyNames);

              
          // 使用指定的實(shí)體及屬性(非主鍵)檢索(滿足屬性 like 串實(shí)體值)數(shù)據(jù)
              public List<T> findLikeByEntity(T entity, String [] propertyNames);

              
          // 使用指定的檢索標(biāo)準(zhǔn)檢索數(shù)據(jù),返回指定范圍的記錄
              public Integer getRowCount(DetachedCriteria criteria);
              
              
          // 使用指定的檢索標(biāo)準(zhǔn)檢索數(shù)據(jù),返回指定統(tǒng)計(jì)值
              public Object getStatValue(DetachedCriteria criteria, String propertyName, String StatName);

              
          // -------------------------------- Others --------------------------------
              
              
          // 加鎖指定的實(shí)體
              public void lock(T entity, LockMode lockMode);
              
              
          // 強(qiáng)制初始化指定的實(shí)體
              public void initialize(Object proxy);

              
          // 強(qiáng)制立即更新緩沖數(shù)據(jù)到數(shù)據(jù)庫(kù)(否則僅在事務(wù)提交時(shí)才更新)
              public void flush();
                  
          }

          GenericHibernateDao.java
          package dao;

          import java.io.Serializable;
          import java.lang.reflect.ParameterizedType;
          import java.lang.reflect.Type;
          import java.util.Collection;
          import java.util.Iterator;
          import java.util.List;
          import org.apache.commons.beanutils.PropertyUtils;
          import org.hibernate.Criteria;
          import org.hibernate.LockMode;
          import org.hibernate.criterion.DetachedCriteria;
          import org.hibernate.criterion.Example;
          import org.hibernate.criterion.MatchMode;
          import org.hibernate.criterion.Order;
          import org.hibernate.criterion.Projections;
          import org.hibernate.criterion.Restrictions;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          /**
           * GenericHibernateDao 繼承 HibernateDao,簡(jiǎn)單封裝 HibernateTemplate 各項(xiàng)功能,
           * 簡(jiǎn)化基于Hibernate Dao 的編寫。 
           * 
           * 
          @author lny
           
          */
          @SuppressWarnings(
          "unchecked")
          public class GenericHibernateDao<extends Serializable, PK extends Serializable>
                  
          extends HibernateDaoSupport implements GenericDao<T, PK>
          {
              
          // 實(shí)體類類型(由構(gòu)造方法自動(dòng)賦值)
              private Class<T> entityClass;

              
          // 構(gòu)造方法,根據(jù)實(shí)例類自動(dòng)獲取實(shí)體類類型
              public GenericHibernateDao()
              {
                  
          this.entityClass = null;
                  Class c 
          = getClass();
                  Type t 
          = c.getGenericSuperclass();
                  
          if (t instanceof ParameterizedType)
                  {
                      Type[] p 
          = ((ParameterizedType) t).getActualTypeArguments();
                      
          this.entityClass = (Class<T>) p[0];
                  }
              }

              
          // -------------------- 基本檢索、增加、修改、刪除操作 --------------------

              
          // 根據(jù)主鍵獲取實(shí)體。如果沒有相應(yīng)的實(shí)體,返回 null。
              public T get(PK id)
              {
                  
          return (T) getHibernateTemplate().get(entityClass, id);
              }

              
          // 根據(jù)主鍵獲取實(shí)體并加鎖。如果沒有相應(yīng)的實(shí)體,返回 null。
              public T getWithLock(PK id, LockMode lock)
              {
                  T t 
          = (T) getHibernateTemplate().get(entityClass, id, lock);
                  
          if (t != null)
                  {
                      
          this.flush();   // 立即刷新,否則鎖不會(huì)生效。
                  }
                  
          return t;
              }

              
          // 根據(jù)主鍵獲取實(shí)體。如果沒有相應(yīng)的實(shí)體,拋出異常。
              public T load(PK id)
              {
                  
          return (T) getHibernateTemplate().load(entityClass, id);
              }

              
          // 根據(jù)主鍵獲取實(shí)體并加鎖。如果沒有相應(yīng)的實(shí)體,拋出異常。
              public T loadWithLock(PK id, LockMode lock)
              {
                  T t 
          = (T) getHibernateTemplate().load(entityClass, id, lock);
                  
          if (t != null)
                  {
                      
          this.flush();   // 立即刷新,否則鎖不會(huì)生效。
                  }
                  
          return t;
              }

              
          // 獲取全部實(shí)體。
              public List<T> loadAll()
              {
                  
          return (List<T>) getHibernateTemplate().loadAll(entityClass);
              }

              
          // loadAllWithLock() ?
              
              
          // 更新實(shí)體
              public void update(T entity)
              {
                  getHibernateTemplate().update(entity);
              }

              
          // 更新實(shí)體并加鎖
              public void updateWithLock(T entity, LockMode lock)
              {
                  getHibernateTemplate().update(entity, lock);
                  
          this.flush();   // 立即刷新,否則鎖不會(huì)生效。
              }

              
          // 存儲(chǔ)實(shí)體到數(shù)據(jù)庫(kù)
              public void save(T entity)
              {
                  getHibernateTemplate().save(entity);
              }

              
          // saveWithLock()?

              
          // 增加或更新實(shí)體
              public void saveOrUpdate(T entity)
              {
                  getHibernateTemplate().saveOrUpdate(entity);
              }

              
          // 增加或更新集合中的全部實(shí)體
              public void saveOrUpdateAll(Collection<T> entities)
              {
                  getHibernateTemplate().saveOrUpdateAll(entities);
              }

              
          // 刪除指定的實(shí)體
              public void delete(T entity)
              {
                  getHibernateTemplate().delete(entity);
              }

              
          // 加鎖并刪除指定的實(shí)體
              public void deleteWithLock(T entity, LockMode lock)
              {
                  getHibernateTemplate().delete(entity, lock);
                  
          this.flush();   // 立即刷新,否則鎖不會(huì)生效。
              }

              
          // 根據(jù)主鍵刪除指定實(shí)體
              public void deleteByKey(PK id)
              {
                  
          this.delete(this.load(id));
              }

              
          // 根據(jù)主鍵加鎖并刪除指定的實(shí)體
              public void deleteByKeyWithLock(PK id, LockMode lock)
              {
                  
          this.deleteWithLock(this.load(id), lock);
              }

              
          // 刪除集合中的全部實(shí)體
              public void deleteAll(Collection<T> entities)
              {
                  getHibernateTemplate().deleteAll(entities);
              }

              
          // -------------------- HSQL ----------------------------------------------
              
              
          // 使用HSQL語(yǔ)句直接增加、更新、刪除實(shí)體
              public int bulkUpdate(String queryString)
              {
                  
          return getHibernateTemplate().bulkUpdate(queryString);
              }

              
          // 使用帶參數(shù)的HSQL語(yǔ)句增加、更新、刪除實(shí)體
              public int bulkUpdate(String queryString, Object[] values)
              {
                  
          return getHibernateTemplate().bulkUpdate(queryString, values);
              }

              
          // 使用HSQL語(yǔ)句檢索數(shù)據(jù)
              public List find(String queryString)
              {
                  
          return getHibernateTemplate().find(queryString);
              }

              
          // 使用帶參數(shù)的HSQL語(yǔ)句檢索數(shù)據(jù)
              public List find(String queryString, Object[] values)
              {
                  
          return getHibernateTemplate().find(queryString, values);
              }

              
          // 使用帶命名的參數(shù)的HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedParam(String queryString, String[] paramNames, Object[] values)
              {
                  
          return getHibernateTemplate().findByNamedParam(queryString, paramNames, values);
              }

              
          // 使用命名的HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedQuery(String queryName)
              {
                  
          return getHibernateTemplate().findByNamedQuery(queryName);
              }

              
          // 使用帶參數(shù)的命名HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedQuery(String queryName, Object[] values)
              {
                  
          return getHibernateTemplate().findByNamedQuery(queryName, values);
              }

              
          // 使用帶命名參數(shù)的命名HSQL語(yǔ)句檢索數(shù)據(jù)
              public List findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values)
              {
                  
          return getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, paramNames, values);
              }

              
          // 使用HSQL語(yǔ)句檢索數(shù)據(jù),返回 Iterator
              public Iterator iterate(String queryString)
              {
                  
          return getHibernateTemplate().iterate(queryString);
              }

              
          // 使用帶參數(shù)HSQL語(yǔ)句檢索數(shù)據(jù),返回 Iterator
              public Iterator iterate(String queryString, Object[] values)
              {
                  
          return getHibernateTemplate().iterate(queryString, values);
              }

              
          // 關(guān)閉檢索返回的 Iterator
              public void closeIterator(Iterator it)
              {
                  getHibernateTemplate().closeIterator(it);
              }

              
          // -------------------------------- Criteria ------------------------------
              
              
          // 創(chuàng)建與會(huì)話無(wú)關(guān)的檢索標(biāo)準(zhǔn)
              public DetachedCriteria createDetachedCriteria()
              {
                  
          return DetachedCriteria.forClass(this.entityClass);
              }
              
              
          // 創(chuàng)建與會(huì)話綁定的檢索標(biāo)準(zhǔn)
              public Criteria createCriteria()
              {
                  
          return this.createDetachedCriteria().getExecutableCriteria(this.getSession());
              }

              
          // 檢索滿足標(biāo)準(zhǔn)的數(shù)據(jù)
              public List findByCriteria(DetachedCriteria criteria)
              {
                  
          return getHibernateTemplate().findByCriteria(criteria);
              }
              
              
          // 檢索滿足標(biāo)準(zhǔn)的數(shù)據(jù),返回指定范圍的記錄
              public List findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults)
              {
                  
          return getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);
              }

              
          // 使用指定的實(shí)體及屬性檢索(滿足除主鍵外屬性=實(shí)體值)數(shù)據(jù)
              public List<T> findEqualByEntity(T entity, String [] propertyNames) 
              {
                  Criteria criteria 
          = this.createCriteria();
                  Example exam 
          = Example.create(entity);
                  exam.excludeZeroes();
                  String [] defPropertys 
          = getSessionFactory().getClassMetadata(entityClass).getPropertyNames();
                  
          for(String defProperty : defPropertys)
                  {
                      
          int ii = 0;
                      
          for(ii = 0; ii < propertyNames.length; ++ii)
                      {
                          
          if(defProperty.equals(propertyNames[ii]))
                          {
                              criteria.addOrder(Order.asc(defProperty));
                              
          break;
                          }
                      }
                      
          if(ii == propertyNames.length)
                      {
                          exam.excludeProperty(defProperty);
                      }
                  }
                  criteria.add(exam);
                  
          return (List<T>) criteria.list();
              }
              
              
          // 使用指定的實(shí)體及屬性檢索(滿足屬性 like 串實(shí)體值)數(shù)據(jù)
              public List<T> findLikeByEntity(T entity, String [] propertyNames)
              {
                  Criteria criteria 
          = this.createCriteria();
                  
          for(String property : propertyNames)
                  {
                      
          try
                      {
                          Object value 
          = PropertyUtils.getProperty(entity, property);
                          
          if(value instanceof String)
                          {
                              criteria.add(Restrictions.like(property, (String) value, MatchMode.ANYWHERE));
                              criteria.addOrder(Order.asc(property));
                          }
                          
          else
                          {
                              criteria.add(Restrictions.eq(property, value));
                              criteria.addOrder(Order.asc(property));
                          }
                      }
                      
          catch(Exception ex)
                      {
                          
          // 忽略無(wú)效的檢索參考數(shù)據(jù)。
                      }
                  }
                  
          return (List<T>) criteria.list();
              }
              
              
          // 使用指定的檢索標(biāo)準(zhǔn)獲取滿足標(biāo)準(zhǔn)的記錄數(shù)
              public Integer getRowCount(DetachedCriteria criteria)
              {
                  criteria.setProjection(Projections.rowCount());
                  List list 
          = this.findByCriteria(criteria, 01);
                  
          return (Integer) list.get(0);
              }

              
          // 使用指定的檢索標(biāo)準(zhǔn)檢索數(shù)據(jù),返回指定統(tǒng)計(jì)值(max,min,avg,sum)
              public Object getStatValue(DetachedCriteria criteria, String propertyName, String StatName)
              {
                  
          if     (StatName.toLowerCase().equals("max")) 
                      criteria.setProjection(Projections.max(propertyName));
                  
          else if(StatName.toLowerCase().equals("min"))
                      criteria.setProjection(Projections.min(propertyName));
                  
          else if(StatName.toLowerCase().equals("avg"))
                      criteria.setProjection(Projections.avg(propertyName));
                  
          else if(StatName.toLowerCase().equals("sum"))
                      criteria.setProjection(Projections.sum(propertyName));
                  
          else return null;
                  List list 
          = this.findByCriteria(criteria, 01);
                  
          return list.get(0);        
              }
              
              
          // -------------------------------- Others --------------------------------
              
              
          // 加鎖指定的實(shí)體
              public void lock(T entity, LockMode lock)
              {
                  getHibernateTemplate().lock(entity, lock);
              }

              
          // 強(qiáng)制初始化指定的實(shí)體
              public void initialize(Object proxy)
              {
                  getHibernateTemplate().initialize(proxy);
              }

              
          // 強(qiáng)制立即更新緩沖數(shù)據(jù)到數(shù)據(jù)庫(kù)(否則僅在事務(wù)提交時(shí)才更新)
              public void flush()
              {
                  getHibernateTemplate().flush();
              }
          }


          posted on 2007-11-20 14:21 飛鷹 閱讀(4306) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 岚皋县| 扬州市| 冷水江市| 福泉市| 昌都县| 江北区| 镇安县| 定南县| 平舆县| 若尔盖县| 板桥市| 海阳市| 广州市| 江安县| 德钦县| 元谋县| 防城港市| 成都市| 余干县| 光泽县| 宁晋县| 精河县| 田东县| 射洪县| 墨玉县| 自贡市| 莱阳市| 城固县| 金寨县| 彰化县| 枣庄市| 荣昌县| 怀仁县| 山东省| 大余县| 修武县| 龙山县| 东方市| 昂仁县| 鞍山市| 扬中市|