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

来源:互联网 发布:爆脂机 知乎 编辑:程序博客网 时间:2024/06/05 02:49

基于泛型的通用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. }