首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts+spring+hibernate通用分页步骤

2012-10-29 
struts+spring+hibernate通用分页方法分页有2种办法:1、??? 从数据库中取得记录,在内存中再划分,如果遇到记

struts+spring+hibernate通用分页方法

分页有2种办法:
1、??? 从数据库中取得记录,在内存中再划分,如果遇到记录数很大的时候效率很成问题,此法不可取。
2、??? 采用hibernate的物理分页,每次只是取一页。从客户端传进来的是第几页和每页多少条记录,要首先查询符合记录的总记录数,再根据总记录数和当前页,每页记录数可以算出要取的是数据库中的第几条记录。2次查询不可避免了。
单元测试如下:
java 代码?
  1. public?final?void?testFindAllRole()?{??
  2. ??
  3. ????????????logger.debug("testFindAllRole");??
  4. ??
  5. ????????????long?l1=System.currentTimeMillis();??
  6. ??
  7. ????????????String?myaction="roleList.do";??
  8. ??
  9. ????????????String?curPageNO?=?"1";??
  10. ??
  11. ????????????CriteriaQuery?cq=new?CriteriaQuery(Role.class,curPageNO,myaction);??
  12. ??
  13. ????????????cq.setPageSize(10);??
  14. ??
  15. ????????????PageSupport?ps=BeanFactory.getInstance().getRightDelegate().findAllRole(cq,?state);??
  16. ??
  17. ????????????long?l2=System.currentTimeMillis();??
  18. ??
  19. ????????????AppUtils.printCollection(ps.getResultList());????
  20. ??
  21. ????????????System.out.println("一共用时为?:??"+(l2-l1));????????????
  22. ??
  23. ????????}??
CriteriaQuery类是对hibernate QBC查询方法的封装,需要的参数是当前操作的实体类,myaction,curPageNO,pageSize,以便构造出相应的上下翻页的工具条。
在delegate中只是将值向下传:
java 代码?
  1. public?PageSupport?findAllRole(CriteriaQuery?cq,?IState?state)?{??
  2. ??
  3. ????????if?(DelegateUtil.isNullParam(cq,?"CriteriaQuery",?state))?{??
  4. ??
  5. ????????????return?null;??
  6. ??
  7. ????????}??
  8. ??
  9. ????????Request?req?=?new?Request();??
  10. ??
  11. ????????req.setServiceName(ServiceConsts.FindAllRoleProcessor);??
  12. ??
  13. ????????req.setValue("CriteriaQuery",?cq);??
  14. ??
  15. ????????try?{??
  16. ??
  17. ????????????Response?resp?=?getDelegate().execute(req);??
  18. ??
  19. ????????????DelegateUtil.setIState(state,?resp);??
  20. ??
  21. ????????????return?(PageSupport)?(resp.getValue("PageSupport"));??
  22. ??
  23. ????????}?catch?(Exception?e)?{??
  24. ??
  25. ????????????DelegateUtil.handleException(e,?"findAllRole",?state);??
  26. ??
  27. ????????}??
  28. ??
  29. ????????return?new?PageSupport();??
  30. ??
  31. ????}?
在业务逻辑模块command中:
java 代码?
  1. public?class?FindAllRole?extends?Command??
  2. {??
  3. ????private?RoleDao?dao;??
  4. ????public?void?setDao(RoleDao?dao)?{??
  5. ????????this.dao?=?dao;??
  6. ????}??
  7. ????public?void?execute(Map?params,?Map?response)?throws?Exception??
  8. ??
  9. ????{??
  10. ????????response.put("PageSupport",?(PageSupport)dao.find((CriteriaQuery)?params.get("CriteriaQuery"),true));??
  11. ????}??
  12. ……??
  13. ??
  14. }??
直接就是调用dao的find方法:
?? java 代码?
  1. public?PageSupport?find(final?CriteriaQuery?cq,final?boolean?isOffset)?{??
  2. ???????return?(PageSupport)getHibernateTemplate().execute(??
  3. ???????????????new?HibernateCallback()?{??
  4. ???????????????????public?Object?doInHibernate(Session?session)?throws?HibernateException,?SQLException?{??
  5. ???????????????????????Criteria?criteria?=?cq.getDetachedCriteria().getExecutableCriteria(session);???
  6. ???????????????????????//得到总行数??
  7. ???????????????????????int?allCounts?=?((Integer)?criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();???
  8. ???????????????????????criteria.setProjection(null);//还原????
  9. ???????????????????????int?curPageNO?=?PagerUtil.getCurPageNO(cq.getCurPage());//?当前页??
  10. ???????????????????????int?offset?=?PagerUtil.getOffset(allCounts,?curPageNO,?cq.getPageSize());??
  11. ???????????????????????String?toolBar?=?PagerUtil.getBar(cq.getMyaction(),allCounts,curPageNO,cq.getPageSize());??
  12. ??
  13. ???????????????????????if(isOffset){??
  14. ??
  15. ???????????????????????????criteria.setFirstResult(offset);??
  16. ??
  17. ???????????????????????????criteria.setMaxResults(cq.getPageSize());??
  18. ??
  19. ???????????????????????}??
  20. ???????????????????????return?new?PageSupport(criteria.list(),toolBar,offset,curPageNO);??
  21. ??
  22. ???????????????????????????}??
  23. ?????????????????????}??
  24. ??
  25. ???????????????,true);??
  26. ???}??

在后台的整个操作中非常简练,只需要将带上参数的CriteriaQuery传到dao就可以实现。CriteriaQuery封装了hibernate的DetachedCriteria。
java 代码?
  1. public?class?CriteriaQuery?implements?Serializable{??
  2. ????public?CriteriaQuery(){??
  3. ????????super();??
  4. ????}??
  5. ????private?static?final?long?serialVersionUID?=?-1464383406564081554L;??
  6. ????//?初始化list??
  7. ????private?String?curPage=null?;??
  8. ????private?int?pageSize=10;??
  9. ????private?String?myaction;??
  10. ????private?String?myform;??
  11. ????private?CriterionList?criterionList;??
  12. ????private?DetachedCriteria?detachedCriteria;??
  13. ??
  14. ????public?CriteriaQuery(Class?c)?{??
  15. ????????this.criterionList?=?new?CriterionList();??
  16. ????????this.detachedCriteria=DetachedCriteria.forClass(c);??
  17. ????}??
  18. ????public?CriteriaQuery(Class?c,String?curPage,String?myaction,String?myform)?{??
  19. ????????this.myaction=myaction;??
  20. ????????this.myform=myform;??
  21. ????????this.curPage=curPage;??
  22. ????????this.criterionList?=?new?CriterionList();??
  23. ????????this.detachedCriteria=DetachedCriteria.forClass(c);??
  24. ????}??
  25. ????public?CriteriaQuery(Class?c,String?curPage,String?myaction)?{??
  26. ????????this.myaction=myaction;??
  27. ????????this.curPage=curPage;??
  28. ????????this.criterionList?=?new?CriterionList();??
  29. ????????this.detachedCriteria=DetachedCriteria.forClass(c);??
  30. ????}??
  31. ????public?CriterionList?getCriterionList()?{??
  32. ????????return?criterionList;??
  33. ????}??
  34. ????public?void?setCriterionList(CriterionList?criterionList)?{??
  35. ????????this.criterionList?=?criterionList;??
  36. ????}??
  37. ??
  38. ????public?String?getCurPage()?{??
  39. ????????return?curPage;??
  40. ????}??
  41. ????public?void?setCurPage(String?curPage)?{??
  42. ????????this.curPage?=?curPage;??
  43. ????}??
  44. ????public?DetachedCriteria?getDetachedCriteria()?{??
  45. ????????return?detachedCriteria;??
  46. ????}??
  47. ????public?void?setDetachedCriteria(DetachedCriteria?detachedCriteria)?{??
  48. ????????this.detachedCriteria?=?detachedCriteria;??
  49. ????}??
  50. ????public?void?add(Criterion?c)?{??
  51. ????????????detachedCriteria.add(c);??
  52. ????}??
  53. ????public?void?add()?{??
  54. ????????for(int?i=0;i
  55. ????????????add(getCriterionList().getParas(i));??
  56. ????????}??
  57. ????}??
  58. ????public?void?createAlias(String?name){??
  59. ????????detachedCriteria.createCriteria(name);??
  60. ????}??
  61. ????public?void?createAlias(String?name,String?value){??
  62. ????????detachedCriteria.createCriteria(name,value);??
  63. ????}??
  64. ????public?Criterion?and(CriteriaQuery?query,?int?source,?int?dest)?{??
  65. ????????return?Restrictions.and(query.getCriterionList().getParas(source),query.getCriterionList().getParas(dest));??
  66. ????}??
  67. ????public?Criterion?and(Criterion?c,CriteriaQuery?query,?int?source)?{??
  68. ????????return?Restrictions.and(c,?query.getCriterionList().getParas(source));??
  69. ????}??
  70. ????public?Criterion?and(Criterion?c1,?Criterion?c2)?{??
  71. ????????return?Restrictions.and(c1,c2);??
  72. ????}??
  73. ????public?Criterion?or(CriteriaQuery?query,?int?source,?int?dest)?{??
  74. ????????return?Restrictions.or(query.getCriterionList().getParas(source),query.getCriterionList().getParas(dest));??
  75. ????}??
  76. ??????
  77. ????public?Criterion?or(Criterion?c,CriteriaQuery?query,?int?source)?{??
  78. ????????return?Restrictions.or(c,?query.getCriterionList().getParas(source));??
  79. ????}??
  80. ??????
  81. ????public?void?or(Criterion?c1,?Criterion?c2)?{??
  82. ????????this.detachedCriteria.add(Restrictions.or(c1,c2));??
  83. ????}??
  84. ????public?void?addOrder(String?ordername,String?ordervalue)?{??
  85. ????????//?写入order查询条件??
  86. ????????if?("asc".equals(ordername))?{??
  87. ????????????detachedCriteria.addOrder(Order.asc(ordervalue));??
  88. ????????}?else?{??
  89. ????????????detachedCriteria.addOrder(Order.desc(ordervalue));??
  90. ????????}??
  91. ????}??
  92. ????public?void?eq(String?keyname,Object?keyvalue){??
  93. ????????criterionList.addPara(Restrictions.eq(keyname,?keyvalue));??
  94. ????}??
  95. ????public?void?notEq(String?keyname,Object?keyvalue){??
  96. ????????criterionList.addPara(Restrictions.or(Restrictions.gt(keyname,?keyvalue),Restrictions.lt(keyname,?keyvalue)));??
  97. ????}??
  98. ????public?void?like(String?keyname,Object?keyvalue){??
  99. ????????criterionList.addPara(Restrictions.like(keyname,?keyvalue));??
  100. ????}??
  101. ????public?void?gt(String?keyname,Object?keyvalue){??
  102. ????????criterionList.addPara(Restrictions.gt(keyname,?keyvalue));??
  103. ????}??
  104. ????public?void?lt(String?keyname,Object?keyvalue){??
  105. ????????criterionList.addPara(Restrictions.lt(keyname,?keyvalue));??
  106. ????}??
  107. ????public?void?le(String?keyname,Object?keyvalue){??
  108. ????????criterionList.addPara(Restrictions.le(keyname,?keyvalue));??
  109. ????}??
  110. ????public?void?ge(String?keyname,Object?keyvalue){??
  111. ????????criterionList.addPara(Restrictions.ge(keyname,?keyvalue));??
  112. ????}??
  113. ????public?void?ilike(String?keyname,Object[]?keyvalue){??
  114. ????????criterionList.addPara(Restrictions.in(keyname,?keyvalue));??
  115. ????}??
  116. ????public?void?between(String?keyname,Object?keyvalue1,Object?keyvalue2)?{??
  117. ????????Criterion?c=null;//?写入between查询条件??
  118. ????????if?(!AppUtils.isBlank(keyvalue1)?&&?!AppUtils.isBlank(keyvalue2))?{??
  119. ????????????c=Restrictions.between(keyname,?keyvalue1,?keyvalue2);??
  120. ????????}?else?if?(!AppUtils.isBlank(keyvalue1))?{??
  121. ????????????c=Restrictions.ge(keyname,?keyvalue1);??
  122. ????????}?else?if?(!AppUtils.isBlank(keyvalue2))?{??
  123. ????????????c=Restrictions.le(keyname,?keyvalue2);??
  124. ????????}??
  125. ????????criterionList.add(c);??
  126. ????}??
  127. ????public?int?getPageSize()?{??
  128. ????????return?pageSize;??
  129. ????}??
  130. ????public?void?setPageSize(int?pageSize)?{??
  131. ????????this.pageSize?=?pageSize;??
  132. ????}??
  133. ????public?String?getMyaction()?{??
  134. ????????return?myaction;??
  135. ????}??
  136. ????public?void?setMyaction(String?myaction)?{??
  137. ????????this.myaction?=?myaction;??
  138. ????}??
  139. ????public?String?getMyform()?{??
  140. ????????return?myform;??
  141. ????}??
  142. ????public?void?setMyform(String?myform)?{??
  143. ????????this.myform?=?myform;??
  144. ????}??
  145. }?

另外需要一些辅助类的支持:
例如PageSupport? 封装了返回的数据和工具条。
java 代码?
  1. public?class?PageSupport??implements?Serializable{??
  2. ????private?int?curPageNO;??
  3. ????private?int?offset;??
  4. ????private?String?toolBar;??
  5. ????private?List?resultList=null;??
  6. ??
  7. ????public?PageSupport()?{??
  8. ??
  9. ????}??
  10. ????public?PageSupport(List?resultList,String?toolBar,int?offset,int?curPageNO)?{??
  11. ????????this.curPageNO=curPageNO;??
  12. ????????this.offset=offset;??
  13. ????????this.toolBar=toolBar;??
  14. ????????this.resultList=resultList;??
  15. ????}??
  16. ????public?List?getResultList()?{??
  17. ????????return?resultList;??
  18. ????}??
  19. ??
  20. ????public?void?setResultList(List?resultList)?{??
  21. ????????this.resultList?=?resultList;??
  22. ????}??
  23. ??
  24. ????public?String?getToolBar()?{??
  25. ????????return?toolBar;??
  26. ????}?

CriterionList封装了Hibernate的参数:
java 代码?
  1. /**?
  2. ?*?封装了ArrayList,装的是Criterion?
  3. ?*/??
  4. public?class?CriterionList?extends?ArrayList?{??
  5. ????public?final?Criterion?getParas(final?int?index)?{??
  6. ????????return?(Criterion)?super.get(index);??
  7. ????}??
  8. ????public?final?void?addPara(final?int?index,?final?Criterion?p)?{??
  9. ????????super.add(index,?p);??
  10. ????}??
  11. ????public?final?void?addPara(final?Criterion?p)?{??
  12. ????????super.add(p);??
  13. ????}??
  14. ????public?final?int?indexofPara(final?Criterion?p)?{??
  15. ????????return?super.indexOf(p);??
  16. ????}??
  17. ????public?final?void?removePara(final?int?index)?{??
  18. ????????super.remove(index);??
  19. ????}??
  20. }??

PagerUtil用于将客户端的页码和每页多少个记录算出应该取数据库中的记录的位置,再由hibernate构造出一个三层的sql语句。
java 代码?
  1. public?class?PagerUtil?{??
  2. ????/**?
  3. ?????*??
  4. ?????*?@param?allCounts?总记录数?
  5. ?????*?@param?curPageNO??
  6. ?????*?@param?pageSize??每页显示的记录数目?
  7. ?????*?@return?
  8. ?????*/??
  9. ????public?static?String??getBar(String?action,String?form,int?allCounts,int?curPageNO,?int?pageSize){??
  10. ????????Pager?pager?=?null;??
  11. ????????????try?{??
  12. ????????????????if?(curPageNO<1)?curPageNO=1;??
  13. ????????????????if?(curPageNO>?(int)?Math.ceil((double)?allCounts?/?pageSize))???
  14. ????????????????????curPageNO?=(int)?Math.ceil((double)?allCounts?/?pageSize);??
  15. ????????????????//得到offset??
  16. ????????????????int?offset?=?(curPageNO-1)*pageSize;//从第几条开始取值??
  17. ?????????????????//生成工具条??
  18. ?????????????????pager=new?Pager(allCounts,offset,pageSize);??
  19. ?????????????????pager.setCurPageNO(curPageNO);//设置当前的页码??
  20. ????????????}?catch?(Exception?e)?{??
  21. ????????????????System.out.println("生成工具条出错!");??
  22. ??????????}??
  23. ?????????return?pager.getToolBar(action,form);??
  24. ????}??
  25. ??????
  26. ????public?static?String??getBar(String?url,int?allCounts,int?curPageNO,?int?pageSize){??
  27. ????????Pager?pager?=?null;??
  28. ????????????try?{??
  29. ????????????????if?(curPageNO<1)?curPageNO=1;??
  30. ????????????????if?(curPageNO>?(int)?Math.ceil((double)?allCounts?/?pageSize))???
  31. ????????????????????curPageNO?=(int)?Math.ceil((double)?allCounts?/?pageSize);??
  32. ????????????????//得到offset??
  33. ????????????????int?offset?=?(curPageNO-1)*pageSize;//从第几条开始取值??
  34. ?????????????????//生成工具条??
  35. ?????????????????pager=new?Pager(allCounts,offset,pageSize);??
  36. ?????????????????pager.setCurPageNO(curPageNO);//设置当前的页码??
  37. ????????????}?catch?(Exception?e)?{??
  38. ????????????????System.out.println("生成工具条出错!");??
  39. ??????????}??
  40. ?????????return?pager.getToolBar(url);??
  41. ????}??
  42. ??????
  43. ????public?static?int?getOffset(int?rowCounts,int?curPageNO,?int?pageSize){??
  44. ????????int?offset=0;??
  45. ????????????try?{??
  46. ????????????????//得到第几页??
  47. ????????????????if?(curPageNO<1)?curPageNO=1;??
  48. ????????????????if?(curPageNO>?(int)?Math.ceil((double)?rowCounts?/?pageSize))???
  49. ????????????????????curPageNO?=(int)?Math.ceil((double)?rowCounts?/?pageSize);??
  50. ????????????????//得到offset??
  51. ??????????????????offset?=?(curPageNO-1)*pageSize;??
  52. ????????????}?catch?(Exception?e)?{??
  53. ????????????????System.out.println("getOffset出错!");??
  54. ????????????}????
  55. ???????return?offset;??
  56. ????}??
  57. ??????
  58. ????public?static?int?getCurPageNO(String?curPage){??
  59. ????????????int?curPageNO;??
  60. ?????????????if?(curPage==null||"".equals(curPage.trim()))?{??
  61. ?????????????????curPageNO=1;//第一次处于第一页??
  62. ??????????????}?else?{??
  63. ??????????????????try?{??
  64. ??????????????????????curPageNO?=?Integer.parseInt(curPage);//得到当前页??
  65. ????????????????}?catch?(Exception?e)?{??
  66. ????????????????????curPageNO=1;??
  67. ????????????????}??
  68. ??????????????}??
  69. ?????????????return?curPageNO;??
  70. ????????}??
  71. }?
  72. 未完,待续
1 楼 aaa 2007-06-22   不是代码rar包呀? 2 楼 onecan 2007-06-22   代码关联到其他的功能了,需要整理一下 3 楼 drinkjava 2007-06-22   提一个变态的需求,如果一个页面上同时有多处出现同样内容的分页,如何处理?
即页面A上同时包含 B,B,B,B,B 5个相同的模块,5个B的内容完全相同,但要保证每个B模块的分页完全独立。 4 楼 onecan 2007-06-23   每个工具条是跟返回的记录绑定到一个pagesupport类里面,通过辅助的类将客户端传进来的参数转换为数据库记录的位置,并且用这些参数来构造一个工具条。pagesupport里面就一个list和string类型的变量,list是返回的记录,string是工具条的html代码,2者是对应的。不同的分页对应到不同的记录和工具条。但是5个分页同时放在一个页面,要注意不要同时刷新了。 5 楼 rainytooo 2007-06-25   现在大家都有自己的分页方案了吧
6 楼 yongyuan.jiang 2007-06-25   简单的分页写了那么多行代码,看都没心情看。

热点排行