泛型DAO类设计模式

Generic Data Access Objects

    普通 数据访问对象,这个是 Hibernate 官方网站上面的一个 DAO 类的设计模式,基于 JDK5.0 范型支持,文章地址如下:

http://www.hibernate.org/328.html

我下面的代码与Hibernate官网上提供的有点不同。

首先定义 DAO 类的接口 IGenericDAO ,该接口定义了共同的 CRUD 操作:

 

java 代码
 
  1. /**  
  2.  * 定义通用的CRUD操作  
  3.  * @author rainlife  
  4.  */   
  5. public interface IGenericDAO 〈T, ID extends Serializable〉
  6. {  
  7. //  通过主键标识查找某个对象。   
  8.     public  T findById(ID id);  
  9.       
  10. //  通过主键标识查找某个对象,可以锁定表中对应的记录。   
  11.     T findById(ID id, boolean  lock);  
  12.   
  13.     //得到所有的对象。   
  14.     List findAll();  
  15.   
  16.     //通过给定的一个对象,查找与其匹配的对象。   
  17.     List findByExample(T exampleInstance);  
  18.   
  19.     //持久化对象。   
  20.     T makePersistent(T entity);  
  21.   
  22.     //删除对象。   
  23.     void  makeTransient(T entity);  
  24. }  

下面是使用 Hibernate 针对该接口的实现 GenericDAOHibernate

java 代码
 
  1. /**  
  2.  * 这是针对IGenericDAO接口的Hibernate实现,完成通用的CRUD操作。  
  3.  * @author rainlife  
  4.  * @param  POJO类  
  5.  * @param   POJO类的主键标识符  
  6.  * @param  针对每一个POJO类的DAO类实现   
  7.  */   
  8. public   abstract   class  GenericDAOHibernate 〈T,ID extends  Serializable, DAOImpl  extends  IGenericDAO〈T,ID〉〉
  9.         implements  IGenericDAO〈T,ID〉
  10. {  
  11.     private  Class persistentClass;  
  12.   
  13.     protected  Session session;  
  14.   
  15.     public  GenericDAOHibernate()  
  16.     {  
  17.         this .persistentClass = (Class) ((ParameterizedType) getClass()  
  18.                 .getGenericSuperclass()).getActualTypeArguments()[0 ];  
  19.     }  
  20.   
  21.     @SuppressWarnings ( "unchecked" )  
  22.     public  DAOImpl setSession(Session s)  
  23.     {  
  24.         this .session = s;  
  25.         return  (DAOImpl) this ;  
  26.     }  
  27.   
  28.     protected  Session getSession()  
  29.     {  
  30.         if  (session ==  null )  
  31.             throw   new  IllegalStateException(  
  32.                     "Session has not been set on DAO before usage" );  
  33.         return  session;  
  34.     }  
  35.   
  36.     public  Class getPersistentClass()  
  37.     {  
  38.         return  persistentClass;  
  39.     }  
  40.   
  41.       
  42.     @SuppressWarnings ( "unchecked" )  
  43.     public  T findById(ID id)  
  44.     {  
  45.         return  (T) getSession().load(getPersistentClass(), id);  
  46.     }  
  47.       
  48.     @SuppressWarnings ( "unchecked" )  
  49.     public  T findById(ID id,  boolean  lock)  
  50.     {  
  51.         T entity;  
  52.         if  (lock)  
  53.             entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);  
  54.         else   
  55.             entity = findById(id);  
  56.   
  57.         return  entity;  
  58.     }  
  59.   
  60.     @SuppressWarnings ( "unchecked" )  
  61.     public  List findAll()  
  62.     {  
  63.         return  findByCriteria();  
  64.     }  
  65.   
  66.     @SuppressWarnings ( "unchecked" )  
  67.     public  List findByExample(T exampleInstance)  
  68.     {  
  69.         Criteria crit = getSession().createCriteria(getPersistentClass());  
  70.         Example example = Example.create(exampleInstance);  
  71.         crit.add(example);  
  72.         return  crit.list();  
  73.     }  
  74.       
  75.     @SuppressWarnings ( "unchecked" )  
  76.     public  List findByExample(T exampleInstance, String[] excludeProperty)  
  77.     {  
  78.         Criteria crit = getSession().createCriteria(getPersistentClass());  
  79.         Example example = Example.create(exampleInstance);  
  80.         for  (String exclude : excludeProperty)  
  81.         {  
  82.             example.excludeProperty(exclude);  
  83.         }  
  84.         crit.add(example);  
  85.         return  crit.list();  
  86.     }  
  87.   
  88.     @SuppressWarnings ( "unchecked" )  
  89.     public  T makePersistent(T entity)  
  90.     {  
  91.         getSession().saveOrUpdate(entity);  
  92.         //getSession().save(entity);   
  93.         return  entity;  
  94.     }  
  95.   
  96.     public   void  makeTransient(T entity)  
  97.     {  
  98.         getSession().delete(entity);  
  99.     }  
  100.   
  101.     @SuppressWarnings ( "unchecked" )  
  102.     protected  List findByCriteria(Criterion... criterion)  
  103.     {  
  104.         Criteria crit = getSession().createCriteria(getPersistentClass());  
  105.         for  (Criterion c : criterion)  
  106.         {  
  107.             crit.add(c);  
  108.         }  
  109.         return  crit.list();  
  110.     }  
  111.       
  112.     @SuppressWarnings ( "unchecked" )  
  113.     /**  
  114.      * 增加了排序的功能。  
  115.      */   
  116.     protected  List findByCriteria(Order order,Criterion... criterion)  
  117.     {  
  118.         Criteria crit = getSession().createCriteria(getPersistentClass());  
  119.         for  (Criterion c : criterion)  
  120.         {  
  121.             crit.add(c);  
  122.         }  
  123.         if (order!= null )  
  124.             crit.addOrder(order);  
  125.         return  crit.list();  
  126.     }  
  127.       
  128.     @SuppressWarnings ( "unchecked" )  
  129.     protected  List findByCriteria( int  firstResult, int  rowCount,Order order,Criterion... criterion)  
  130.     {  
  131.         Criteria crit = getSession().createCriteria(getPersistentClass());  
  132.         for  (Criterion c : criterion)  
  133.         {  
  134.             crit.add(c);  
  135.         }  
  136.         if (order!= null )  
  137.             crit.addOrder(order);  
  138.         crit.setFirstResult(firstResult);  
  139.         crit.setMaxResults(rowCount);  
  140.         return  crit.list();  
  141.     }  
  142. }  

这样,我们自己所要使用的 DAO 类,就可以直接从这个 HibernateDAO 类继承:

比如说我们定义一个 IUserDAO 接口,该接口继承 IGenericDAO:

java 代码
  1. public   interface  IUserDAO  extends IGenericDAO〈User,Integer〉
  2. {  
  3.     public  User find(String username,String password);  
  4.     public  User find(String username);  
  5. }  

 

该接口从 IGenericDAO 继承,自然也就定义了 IGenericDAO 接口所定义的通用 CRUD 操作。

 

再来看一下针对 IUserDAO Hibernate 实现 UserDAOHibernate:

java 代码
  1. public class UserDAOHibernate extends GenericDAOHibernate〈User,Integer,IUserDAO〉 implements IUserDAO {      
  2.   
  3.     public  User find(String username, String password) {  
  4.         //此处省略具体代码   
  5.     }  
  6.   
  7.     public  User find(String username) {  
  8.         //此处省略具体代码   
  9.     }  
  10. }  

 

UserDAOHibernate 继承 GenericDAOHibernate 并实现 IUserDAO 接口,这样,我们的 UserDAOHibernate 既拥有通用的 CRUD 操作,也实现了针对用户的特定的业务操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么我们要使用通用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、付费专栏及课程。

余额充值