java泛型:一个通用的泛型GenericHibernateDao

编写Spring+Hibernate框架下的应用,总是离不了编写一个通用的泛型GenericHibernateDao。查阅了网上不少的GenericHibernateDao实现,归纳整理为如下实现,供后续编码参考。

GenericDao.java:

Java代码 复制代码
  1. package dao;   
  2.   
  3. import java.io.Serializable;   
  4. import java.util.Collection;   
  5. import java.util.Iterator;   
  6. import java.util.List;   
  7. import org.hibernate.Criteria;   
  8. import org.hibernate.LockMode;   
  9. import org.hibernate.criterion.DetachedCriteria;   
  10.   
  11. /**  
  12.  *  
  13.  * @author lny  
  14.  */  
  15. public interface GenericDao<T extends Serializable, PK extends Serializable>   
  16. {   
  17.     // -------------------- 基本检索、增加、修改、删除操作 --------------------   
  18.   
  19.     // 根据主键获取实体。如果没有相应的实体,返回 null。   
  20.     public T get(PK id);   
  21.   
  22.     // 根据主键获取实体并加锁。如果没有相应的实体,返回 null。   
  23.     public T getWithLock(PK id, LockMode lock);   
  24.   
  25.     // 根据主键获取实体。如果没有相应的实体,抛出异常。   
  26.     public T load(PK id);   
  27.   
  28.     // 根据主键获取实体并加锁。如果没有相应的实体,抛出异常。   
  29.     public T loadWithLock(PK id, LockMode lock);   
  30.   
  31.     // 获取全部实体。   
  32.     public List<T> loadAll();   
  33.   
  34.     // loadAllWithLock() ?   
  35.   
  36.     // 更新实体   
  37.     public void update(T entity);   
  38.   
  39.     // 更新实体并加锁   
  40.     public void updateWithLock(T entity, LockMode lock);   
  41.   
  42.     // 存储实体到数据库   
  43.     public void save(T entity);   
  44.   
  45.     // saveWithLock()   
  46.   
  47.     // 增加或更新实体   
  48.     public void saveOrUpdate(T entity);   
  49.   
  50.     // 增加或更新集合中的全部实体   
  51.     public void saveOrUpdateAll(Collection<T> entities);   
  52.   
  53.     // 删除指定的实体   
  54.     public void delete(T entity);   
  55.   
  56.     // 加锁并删除指定的实体   
  57.     public void deleteWithLock(T entity, LockMode lock);   
  58.   
  59.     // 根据主键删除指定实体   
  60.     public void deleteByKey(PK id);   
  61.   
  62.     // 根据主键加锁并删除指定的实体   
  63.     public void deleteByKeyWithLock(PK id, LockMode lock);   
  64.   
  65.     // 删除集合中的全部实体   
  66.     public void deleteAll(Collection<T> entities);   
  67.   
  68.     // -------------------- HSQL ----------------------------------------------   
  69.   
  70.     // 使用HSQL语句直接增加、更新、删除实体   
  71.     public int bulkUpdate(String queryString);   
  72.   
  73.     // 使用带参数的HSQL语句增加、更新、删除实体   
  74.     public int bulkUpdate(String queryString, Object[] values);   
  75.   
  76.     // 使用HSQL语句检索数据   
  77.     public List find(String queryString);   
  78.   
  79.     // 使用带参数的HSQL语句检索数据   
  80.     public List find(String queryString, Object[] values);   
  81.   
  82.     // 使用带命名的参数的HSQL语句检索数据   
  83.     public List findByNamedParam(String queryString, String[] paramNames, Object[] values);   
  84.   
  85.     // 使用命名的HSQL语句检索数据   
  86.     public List findByNamedQuery(String queryName);   
  87.   
  88.     // 使用带参数的命名HSQL语句检索数据   
  89.     public List findByNamedQuery(String queryName, Object[] values);   
  90.   
  91.     // 使用带命名参数的命名HSQL语句检索数据   
  92.     public List findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values);   
  93.   
  94.     // 使用HSQL语句检索数据,返回 Iterator   
  95.     public Iterator iterate(String queryString);   
  96.        
  97.     // 使用带参数HSQL语句检索数据,返回 Iterator   
  98.     public Iterator iterate(String queryString, Object[] values);   
  99.        
  100.     // 关闭检索返回的 Iterator   
  101.     public void closeIterator(Iterator it);   
  102.        
  103.     // -------------------------------- Criteria ------------------------------   
  104.        
  105.     // 创建与会话无关的检索标准对象   
  106.     public DetachedCriteria createDetachedCriteria();   
  107.   
  108.     // 创建与会话绑定的检索标准对象   
  109.     public Criteria createCriteria();   
  110.   
  111.     // 使用指定的检索标准检索数据   
  112.     public List findByCriteria(DetachedCriteria criteria);   
  113.        
  114.     // 使用指定的检索标准检索数据,返回部分记录   
  115.     public List findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults);   
  116.   
  117.     // 使用指定的实体及属性检索(满足除主键外属性=实体值)数据   
  118.     public List<T> findEqualByEntity(T entity, String [] propertyNames);   
  119.   
  120.     // 使用指定的实体及属性(非主键)检索(满足属性 like 串实体值)数据   
  121.     public List<T> findLikeByEntity(T entity, String [] propertyNames);   
  122.   
  123.     // 使用指定的检索标准检索数据,返回指定范围的记录   
  124.     public Integer getRowCount(DetachedCriteria criteria);   
  125.        
  126.     // 使用指定的检索标准检索数据,返回指定统计值   
  127.     public Object getStatValue(DetachedCriteria criteria, String propertyName, String StatName);   
  128.   
  129.     // -------------------------------- Others --------------------------------   
  130.        
  131.     // 加锁指定的实体   
  132.     public void lock(T entity, LockMode lockMode);   
  133.        
  134.     // 强制初始化指定的实体   
  135.     public void initialize(Object proxy);   
  136.   
  137.     // 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新)   
  138.     public void flush();   
  139.            
  140. }  

GenericHibernateDao.java

Java代码 复制代码
  1. package dao;   
  2.   
  3. import java.io.Serializable;   
  4. import java.lang.reflect.ParameterizedType;   
  5. import java.lang.reflect.Type;   
  6. import java.util.Collection;   
  7. import java.util.Iterator;   
  8. import java.util.List;   
  9. import org.apache.commons.beanutils.PropertyUtils;   
  10. import org.hibernate.Criteria;   
  11. import org.hibernate.LockMode;   
  12. import org.hibernate.criterion.DetachedCriteria;   
  13. import org.hibernate.criterion.Example;   
  14. import org.hibernate.criterion.MatchMode;   
  15. import org.hibernate.criterion.Order;   
  16. import org.hibernate.criterion.Projections;   
  17. import org.hibernate.criterion.Restrictions;   
  18. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
  19.   
  20. /**  
  21.  * GenericHibernateDao 继承 HibernateDao,简单封装 HibernateTemplate 各项功能,  
  22.  * 简化基于Hibernate Dao 的编写。   
  23.  *   
  24.  * @author lny  
  25.  */  
  26. @SuppressWarnings("unchecked")   
  27. public class GenericHibernateDao<T extends Serializable, PK extends Serializable>   
  28.         extends HibernateDaoSupport implements GenericDao<T, PK>   
  29. {   
  30.     // 实体类类型(由构造方法自动赋值)   
  31.     private Class<T> entityClass;   
  32.   
  33.     // 构造方法,根据实例类自动获取实体类类型   
  34.     public GenericHibernateDao()   
  35.     {   
  36.         this.entityClass = null;   
  37.         Class c = getClass();   
  38.         Type t = c.getGenericSuperclass();   
  39.         if (t instanceof ParameterizedType)   
  40.         {   
  41.             Type[] p = ((ParameterizedType) t).getActualTypeArguments();   
  42.             this.entityClass = (Class<T>) p[0];   
  43.         }   
  44.     }   
  45.   
  46.     // -------------------- 基本检索、增加、修改、删除操作 --------------------   
  47.   
  48.     // 根据主键获取实体。如果没有相应的实体,返回 null。   
  49.     public T get(PK id)   
  50.     {   
  51.         return (T) getHibernateTemplate().get(entityClass, id);   
  52.     }   
  53.   
  54.     // 根据主键获取实体并加锁。如果没有相应的实体,返回 null。   
  55.     public T getWithLock(PK id, LockMode lock)   
  56.     {   
  57.         T t = (T) getHibernateTemplate().get(entityClass, id, lock);   
  58.         if (t != null)   
  59.         {   
  60.             this.flush();   // 立即刷新,否则锁不会生效。   
  61.         }   
  62.         return t;   
  63.     }   
  64.   
  65.     // 根据主键获取实体。如果没有相应的实体,抛出异常。   
  66.     public T load(PK id)   
  67.     {   
  68.         return (T) getHibernateTemplate().load(entityClass, id);   
  69.     }   
  70.   
  71.     // 根据主键获取实体并加锁。如果没有相应的实体,抛出异常。   
  72.     public T loadWithLock(PK id, LockMode lock)   
  73.     {   
  74.         T t = (T) getHibernateTemplate().load(entityClass, id, lock);   
  75.         if (t != null)   
  76.         {   
  77.             this.flush();   // 立即刷新,否则锁不会生效。   
  78.         }   
  79.         return t;   
  80.     }   
  81.   
  82.     // 获取全部实体。   
  83.     public List<T> loadAll()   
  84.     {   
  85.         return (List<T>) getHibernateTemplate().loadAll(entityClass);   
  86.     }   
  87.   
  88.     // loadAllWithLock() ?   
  89.        
  90.     // 更新实体   
  91.     public void update(T entity)   
  92.     {   
  93.         getHibernateTemplate().update(entity);   
  94.     }   
  95.   
  96.     // 更新实体并加锁   
  97.     public void updateWithLock(T entity, LockMode lock)   
  98.     {   
  99.         getHibernateTemplate().update(entity, lock);   
  100.         this.flush();   // 立即刷新,否则锁不会生效。   
  101.     }   
  102.   
  103.     // 存储实体到数据库   
  104.     public void save(T entity)   
  105.     {   
  106.         getHibernateTemplate().save(entity);   
  107.     }   
  108.   
  109.     // saveWithLock()?   
  110.   
  111.     // 增加或更新实体   
  112.     public void saveOrUpdate(T entity)   
  113.     {   
  114.         getHibernateTemplate().saveOrUpdate(entity);   
  115.     }   
  116.   
  117.     // 增加或更新集合中的全部实体   
  118.     public void saveOrUpdateAll(Collection<T> entities)   
  119.     {   
  120.         getHibernateTemplate().saveOrUpdateAll(entities);   
  121.     }   
  122.   
  123.     // 删除指定的实体   
  124.     public void delete(T entity)   
  125.     {   
  126.         getHibernateTemplate().delete(entity);   
  127.     }   
  128.   
  129.     // 加锁并删除指定的实体   
  130.     public void deleteWithLock(T entity, LockMode lock)   
  131.     {   
  132.         getHibernateTemplate().delete(entity, lock);   
  133.         this.flush();   // 立即刷新,否则锁不会生效。   
  134.     }   
  135.   
  136.     // 根据主键删除指定实体   
  137.     public void deleteByKey(PK id)   
  138.     {   
  139.         this.delete(this.load(id));   
  140.     }   
  141.   
  142.     // 根据主键加锁并删除指定的实体   
  143.     public void deleteByKeyWithLock(PK id, LockMode lock)   
  144.     {   
  145.         this.deleteWithLock(this.load(id), lock);   
  146.     }   
  147.   
  148.     // 删除集合中的全部实体   
  149.     public void deleteAll(Collection<T> entities)   
  150.     {   
  151.         getHibernateTemplate().deleteAll(entities);   
  152.     }   
  153.   
  154.     // -------------------- HSQL ----------------------------------------------   
  155.        
  156.     // 使用HSQL语句直接增加、更新、删除实体   
  157.     public int bulkUpdate(String queryString)   
  158.     {   
  159.         return getHibernateTemplate().bulkUpdate(queryString);   
  160.     }   
  161.   
  162.     // 使用带参数的HSQL语句增加、更新、删除实体   
  163.     public int bulkUpdate(String queryString, Object[] values)   
  164.     {   
  165.         return getHibernateTemplate().bulkUpdate(queryString, values);   
  166.     }   
  167.   
  168.     // 使用HSQL语句检索数据   
  169.     public List find(String queryString)   
  170.     {   
  171.         return getHibernateTemplate().find(queryString);   
  172.     }   
  173.   
  174.     // 使用带参数的HSQL语句检索数据   
  175.     public List find(String queryString, Object[] values)   
  176.     {   
  177.         return getHibernateTemplate().find(queryString, values);   
  178.     }   
  179.   
  180.     // 使用带命名的参数的HSQL语句检索数据   
  181.     public List findByNamedParam(String queryString, String[] paramNames, Object[] values)   
  182.     {   
  183.         return getHibernateTemplate().findByNamedParam(queryString, paramNames, values);   
  184.     }   
  185.   
  186.     // 使用命名的HSQL语句检索数据   
  187.     public List findByNamedQuery(String queryName)   
  188.     {   
  189.         return getHibernateTemplate().findByNamedQuery(queryName);   
  190.     }   
  191.   
  192.     // 使用带参数的命名HSQL语句检索数据   
  193.     public List findByNamedQuery(String queryName, Object[] values)   
  194.     {   
  195.         return getHibernateTemplate().findByNamedQuery(queryName, values);   
  196.     }   
  197.   
  198.     // 使用带命名参数的命名HSQL语句检索数据   
  199.     public List findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values)   
  200.     {   
  201.         return getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, paramNames, values);   
  202.     }   
  203.   
  204.     // 使用HSQL语句检索数据,返回 Iterator   
  205.     public Iterator iterate(String queryString)   
  206.     {   
  207.         return getHibernateTemplate().iterate(queryString);   
  208.     }   
  209.   
  210.     // 使用带参数HSQL语句检索数据,返回 Iterator   
  211.     public Iterator iterate(String queryString, Object[] values)   
  212.     {   
  213.         return getHibernateTemplate().iterate(queryString, values);   
  214.     }   
  215.   
  216.     // 关闭检索返回的 Iterator   
  217.     public void closeIterator(Iterator it)   
  218.     {   
  219.         getHibernateTemplate().closeIterator(it);   
  220.     }   
  221.   
  222.     // -------------------------------- Criteria ------------------------------   
  223.        
  224.     // 创建与会话无关的检索标准   
  225.     public DetachedCriteria createDetachedCriteria()   
  226.     {   
  227.         return DetachedCriteria.forClass(this.entityClass);   
  228.     }   
  229.        
  230.     // 创建与会话绑定的检索标准   
  231.     public Criteria createCriteria()   
  232.     {   
  233.         return this.createDetachedCriteria().getExecutableCriteria(this.getSession());   
  234.     }   
  235.   
  236.     // 检索满足标准的数据   
  237.     public List findByCriteria(DetachedCriteria criteria)   
  238.     {   
  239.         return getHibernateTemplate().findByCriteria(criteria);   
  240.     }   
  241.        
  242.     // 检索满足标准的数据,返回指定范围的记录   
  243.     public List findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults)   
  244.     {   
  245.         return getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);   
  246.     }   
  247.   
  248.     // 使用指定的实体及属性检索(满足除主键外属性=实体值)数据   
  249.     public List<T> findEqualByEntity(T entity, String [] propertyNames)    
  250.     {   
  251.         Criteria criteria = this.createCriteria();   
  252.         Example exam = Example.create(entity);   
  253.         exam.excludeZeroes();   
  254.         String [] defPropertys = getSessionFactory().getClassMetadata(entityClass).getPropertyNames();   
  255.         for(String defProperty : defPropertys)   
  256.         {   
  257.             int ii = 0;   
  258.             for(ii = 0; ii < propertyNames.length; ++ii)   
  259.             {   
  260.                 if(defProperty.equals(propertyNames[ii]))   
  261.                 {   
  262.                     criteria.addOrder(Order.asc(defProperty));   
  263.                     break;   
  264.                 }   
  265.             }   
  266.             if(ii == propertyNames.length)   
  267.             {   
  268.                 exam.excludeProperty(defProperty);   
  269.             }   
  270.         }   
  271.         criteria.add(exam);   
  272.         return (List<T>) criteria.list();   
  273.     }   
  274.        
  275.     // 使用指定的实体及属性检索(满足属性 like 串实体值)数据   
  276.     public List<T> findLikeByEntity(T entity, String [] propertyNames)   
  277.     {   
  278.         Criteria criteria = this.createCriteria();   
  279.         for(String property : propertyNames)   
  280.         {   
  281.             try  
  282.             {   
  283.                 Object value = PropertyUtils.getProperty(entity, property);   
  284.                 if(value instanceof String)   
  285.                 {   
  286.                     criteria.add(Restrictions.like(property, (String) value, MatchMode.ANYWHERE));   
  287.                     criteria.addOrder(Order.asc(property));   
  288.                 }   
  289.                 else  
  290.                 {   
  291.                     criteria.add(Restrictions.eq(property, value));   
  292.                     criteria.addOrder(Order.asc(property));   
  293.                 }   
  294.             }   
  295.             catch(Exception ex)   
  296.             {   
  297.                 // 忽略无效的检索参考数据。   
  298.             }   
  299.         }   
  300.         return (List<T>) criteria.list();   
  301.     }   
  302.        
  303.     // 使用指定的检索标准获取满足标准的记录数   
  304.     public Integer getRowCount(DetachedCriteria criteria)   
  305.     {   
  306.         criteria.setProjection(Projections.rowCount());   
  307.         List list = this.findByCriteria(criteria, 01);   
  308.         return (Integer) list.get(0);   
  309.     }   
  310.   
  311.     // 使用指定的检索标准检索数据,返回指定统计值(max,min,avg,sum)   
  312.     public Object getStatValue(DetachedCriteria criteria, String propertyName, String StatName)   
  313.     {   
  314.         if     (StatName.toLowerCase().equals("max"))    
  315.             criteria.setProjection(Projections.max(propertyName));   
  316.         else if(StatName.toLowerCase().equals("min"))   
  317.             criteria.setProjection(Projections.min(propertyName));   
  318.         else if(StatName.toLowerCase().equals("avg"))   
  319.             criteria.setProjection(Projections.avg(propertyName));   
  320.         else if(StatName.toLowerCase().equals("sum"))   
  321.             criteria.setProjection(Projections.sum(propertyName));   
  322.         else return null;   
  323.         List list = this.findByCriteria(criteria, 01);   
  324.         return list.get(0);           
  325.     }   
  326.        
  327.     // -------------------------------- Others --------------------------------   
  328.        
  329.     // 加锁指定的实体   
  330.     public void lock(T entity, LockMode lock)   
  331.     {   
  332.         getHibernateTemplate().lock(entity, lock);   
  333.     }   
  334.   
  335.     // 强制初始化指定的实体   
  336.     public void initialize(Object proxy)   
  337.     {   
  338.         getHibernateTemplate().initialize(proxy);   
  339.     }   
  340.   
  341.     // 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新)   
  342.     public void flush()   
  343.     {   
  344.         getHibernateTemplate().flush();   
  345.     }   
  346. }  
Tags:  泛型类 什么是泛型 泛型编程 java泛型

延伸阅读

最新评论

发表评论