`

基于泛型的通用Dao接口和hibernate的实现

阅读更多

基于泛型的通用Dao接口:(主要是在使用hibernate或JPA时使用)

 

  1. package com.qiujy.dao;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5.  * 基于泛型的通用Dao接口
  6.  */
  7. public interface GenericDao<T> {
  8.     void create(T entity);
  9.     void delete(T entity);
  10.     void update(T entity);
  11.     
  12.     T findById(Serializable id);
  13.     List<T> findAll();
  14.     List<T> findList(int pageNo, int pageSize);
  15.     int getCountOfAll();
  16. }

hibernate对此泛型Dao接口的使用:

  1. package com.qiujy.dao.hibernate;
  2. import java.io.Serializable;
  3. import java.lang.reflect.ParameterizedType;
  4. import java.util.List;
  5. import org.hibernate.criterion.Projections;
  6. import com.qiujy.common.HibernateUtil;
  7. import com.qiujy.dao.GenericDao;
  8. /**
  9.  * Hibernate对泛型通用Dao接口的实现
  10.  */
  11. public class GenericHibernateDaoImpl<T> implements GenericDao<T> {
  12.     private Class<T> clazz;
  13.     @SuppressWarnings("unchecked")
  14.     public GenericHibernateDaoImpl() {
  15.         //通过反射获取T的类型信息实例
  16.         this.clazz = (Class<T>)((ParameterizedType)this.getClass().getGenericSuperclass())
  17.                             .getActualTypeArguments()[0];
  18.     }
  19.     public void create(T entity) {
  20.         HibernateUtil.getSession().save(entity);
  21.     }
  22.     public void delete(T entity) {
  23.         HibernateUtil.getSession().delete(entity);
  24.     }
  25.     
  26.     @SuppressWarnings("unchecked")
  27.     public void update(T entity) {
  28.         //HibernateUtil.getSession().saveOrUpdate(entity);
  29.         entity = (T) HibernateUtil.getSession().merge(entity);
  30.     }
  31.     @SuppressWarnings("unchecked")
  32.     public List<T> findAll() {
  33.         return HibernateUtil.getSession().createCriteria(clazz).list();
  34.     }
  35.     @SuppressWarnings("unchecked")
  36.     public List<T> findList(int pageNo, int pageSize) {
  37.         return HibernateUtil.getSession().createCriteria(clazz)
  38.                                          .setFirstResult((pageNo - 1) * pageSize)
  39.                                          .setMaxResults(pageSize)
  40.                                          .list();
  41.     }
  42.     public int getCountOfAll() {
  43.         Integer count = (Integer) HibernateUtil.getSession()
  44.                                                .createCriteria(clazz)
  45.                                                .setProjection(Projections.rowCount())
  46.                                                .uniqueResult();
  47.         if (null == count) {
  48.             return 0;
  49.         } else {
  50.             return count.intValue();
  51.         }
  52.     }
  53.     @SuppressWarnings("unchecked")
  54.     public T findById(Serializable id) {
  55.         return (T)HibernateUtil.getSession().load(clazz, id); //get
  56.     }
  57. }

 

使用泛型Dao接口:

 

  1. package com.qiujy.dao;
  2. import java.util.List;
  3. import com.qiujy.domain.Resource;
  4. /**
  5.  * Resource类的Dao接口
  6.  */
  7. public interface ResourceDao extends GenericDao<Resource> {
  8.     
  9.     public List<Resource> findResources(int status);
  10. }

使用hibernate的实现:

  1. package com.qiujy.dao.hibernate;
  2. import java.util.List;
  3. import com.qiujy.common.HibernateUtil;
  4. import com.qiujy.dao.ResourceDao;
  5. import com.qiujy.domain.Resource;
  6. public class ResourceDaoImpl extends GenericHibernateDaoImpl<Resource> implements ResourceDao {
  7.     @SuppressWarnings("unchecked")
  8.     public List<Resource> findResources(int status) {
  9.         
  10.         return (List<Resource>)HibernateUtil.getSession()
  11.                                     .createQuery("from Resource where status=:status")
  12.                                     .setInteger("status", status)
  13.                                     .list();
  14.     }
  15.     
  16. }
4
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics