基于泛型的通用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. }
为什么我们要使用通用DAO接口呢,因为我们的数据库操作无非是增删改查,CRUD操作,我们不需要为每个实体去编写一个dao接口,对于相似的实体操作可以只编写一个通用接口,然后采用不同的实现DAO已经成为持久层的标准模式,DAO使结构清晰,面向接口编程为代码提供了规范。而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化解决方案的GenericHibernateDao实现类,被定义为抽象类,它提取了CRUD操作,这就是简化代码的关键,以便于更好的重用,这个就不给例子了,增删改都好写,查就需要各种条件了。 然后是各个领域对象的dao接口,这些dao接口都继承GenericDao接口,这样各个领域对象的dao接口就和传统dao接口具有一样的功能了。 下一步是实现类了,个自领域对象去实现各自的接口,还要集成上面的抽象类,这样就实现了代码复用的最大化,实现类中只需要写出额外的查询操作就可以了。当然还要获得域对象的Class实例,这就要在构造方法中传入Class实例。用spring提供的HibernateTemplate注入到GenericHibernateDao中,这样在各个实现类就可以直接调用HibernateTemplate来实现额外的查询操作了。 如果在实现类中不想调用某个方法(例如:update()),就可以覆盖它,方法中抛出UnsupportedOperationException()异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值