网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>高级技术>>设计模式>查看文档  
  generic data access objects 设计模式     
  文章作者:未知  文章来源:中国IT实验室  
  查看:75次  录入:管理员--2007-11-20  
 

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操作,也实现了针对用户的特定的业务操作。

说明 :由于范型的符号经过在线编辑器发布后,被过滤掉了,所以上面修改后的几个符号,都是我在中文状态下输入的。

 
 
上一篇: 校验值对象——应用visitor模式和反射    下一篇: 设计模式基本思想
  相关文档
java源码分析:深入探讨iterator模式 11-20
java设计模式之 Composite(组合) 03-14
在组合模式中实现访问者(visitor)模式 11-20
bridge模式 和composite模式 11-20
综合应用 j2ee应用中常见的反模式 11-20
用Reflection实现Visitor模式 03-14
教程:适配器模式(adapter pattern)组图 11-20
设计模式之Facade(外观) 03-14
java设计模式之template(算法的骨架) 11-20
jsf框架中使用的设计模式介绍 11-20
两种java容器类list和set分析 11-20
emf模型解析的策略分析 11-20
composite模式及其在jsf中的应用 11-20
J2EE中的设计模式 03-14
爪哇语言观察者模式介绍 03-14
单例模式singleton的实现 11-20
爪哇语言工厂方法创立性模式介绍(下) 03-14
《J2EE核心模式》(DAO模式) 03-14
可扩展的java应用程序开发模式 11-20
25种java模式代码参考手册 11-20
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息