Generic Data Access Objects 设计模式

2008-01-05 10:35:42  作者

Generic Data Access Objects

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

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

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

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

Java 代码
  1. /**
  2. *定义通用的CRUD操作
  3. *@authorrainlife
  4. */
  5. public interface IGenericDAO 〈T, ID extends Serializable〉
  6. {
  7. //通过主键标识查找某个对象。
  8. publicTfindById(IDid);
  9. //通过主键标识查找某个对象,可以锁定表中对应的记录。
  10. TfindById(IDid,booleanlock);
  11. //得到所有的对象。
  12. ListfindAll();
  13. //通过给定的一个对象,查找与其匹配的对象。
  14. ListfindByExample(TexampleInstance);
  15. //持久化对象。
  16. TmakePersistent(Tentity);
  17. //删除对象。
  18. voidmakeTransient(Tentity);
  19. }

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

java 代码
  1. /**
  2. *这是针对IGenericDAO接口的Hibernate实现,完成通用的CRUD操作。
  3. *@authorrainlife
  4. *@paramPOJO类
  5. *@paramPOJO类的主键标识符
  6. *@param针对每一个POJO类的DAO类实现
  7. */
  8. publicabstractclassGenericDAOHibernate 〈T,ID extendsSerializable,DAOImplextendsIGenericDAO〈T,ID〉〉
  9. implementsIGenericDAO〈T,ID〉
  10. {
  11. privateClasspersistentClass;
  12. protectedSessionsession;
  13. publicGenericDAOHibernate()
  14. {
  15. this.persistentClass=(Class)((ParameterizedType)getClass()
  16. .getGenericSuperclass()).getActualTypeArguments()[0];
  17. }
  18. @SuppressWarnings("unchecked")
  19. publicDAOImplsetSession(Sessions)
  20. {
  21. this.session=s;
  22. return(DAOImpl)this;
  23. }
  24. protectedSessiongetSession()
  25. {
  26. if(session==null)
  27. thrownewIllegalStateException(
  28. "SessionhasnotbeensetonDAObeforeusage");
  29. returnsession;
  30. }
  31. publicClassgetPersistentClass()
  32. {
  33. returnpersistentClass;
  34. }
  35. @SuppressWarnings("unchecked")
  36. publicTfindById(IDid)
  37. {
  38. return(T)getSession().load(getPersistentClass(),id);
  39. }
  40. @SuppressWarnings("unchecked")
  41. publicTfindById(IDid,booleanlock)
  42. {
  43. Tentity;
  44. if(lock)
  45. entity=(T)getSession().load(getPersistentClass(),id,LockMode.UPGRADE);
  46. else
  47. entity=findById(id);
  48. returnentity;
  49. }
  50. @SuppressWarnings("unchecked")
  51. publicListfindAll()
  52. {
  53. returnfindByCriteria();
  54. }
  55. @SuppressWarnings("unchecked")
  56. publicListfindByExample(TexampleInstance)
  57. {
  58. Criteriacrit=getSession().createCriteria(getPersistentClass());
  59. Exampleexample=Example.create(exampleInstance);
  60. crit.add(example);
  61. returncrit.list();
  62. }
  63. @SuppressWarnings("unchecked")
  64. publicListfindByExample(TexampleInstance,String[]excludeProperty)
  65. {
  66. Criteriacrit=getSession().createCriteria(getPersistentClass());
  67. Exampleexample=Example.create(exampleInstance);
  68. for(Stringexclude:excludeProperty)
  69. {
  70. example.excludeProperty(exclude);
  71. }
  72. crit.add(example);
  73. returncrit.list();
  74. }
  75. @SuppressWarnings("unchecked")
  76. publicTmakePersistent(Tentity)
  77. {
  78. getSession().saveOrUpdate(entity);
  79. //getSession().save(entity);
  80. returnentity;
  81. }
  82. publicvoidmakeTransient(Tentity)
  83. {
  84. getSession().delete(entity);
  85. }
  86. @SuppressWarnings("unchecked")
  87. protectedListfindByCriteria(Criterion...criterion)
  88. {
  89. Criteriacrit=getSession().createCriteria(getPersistentClass());
  90. for(Criterionc:criterion)
  91. {
  92. crit.add(c);
  93. }
  94. returncrit.list();
  95. }
  96. @SuppressWarnings("unchecked")
  97. /**
  98. *增加了排序的功能。
  99. */
  100. protectedListfindByCriteria(Orderorder,Criterion...criterion)
  101. {
  102. Criteriacrit=getSession().createCriteria(getPersistentClass());
  103. for(Criterionc:criterion)
  104. {
  105. crit.add(c);
  106. }
  107. if(order!=null)
  108. crit.addOrder(order);
  109. returncrit.list();
  110. }
  111. @SuppressWarnings("unchecked")
  112. protectedListfindByCriteria(intfirstResult,introwCount,Orderorder,Criterion...criterion)
  113. {
  114. Criteriacrit=getSession().createCriteria(getPersistentClass());
  115. for(Criterionc:criterion)
  116. {
  117. crit.add(c);
  118. }
  119. if(order!=null)
  120. crit.addOrder(order);
  121. crit.setFirstResult(firstResult);
  122. crit.setMaxResults(rowCount);
  123. returncrit.list();
  124. }
  125. }

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

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

java 代码
  1. publicinterfaceIUserDAOextends IGenericDAO〈User,Integer〉
  2. {
  3. publicUserfind(Stringusername,StringpassWord);
  4. publicUserfind(Stringusername);
  5. }

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