测品娱乐
您的当前位置:首页hibernate分页

hibernate分页

来源:测品娱乐
学过Hibernate的程序员都知道,在Hibernate中为用户准备好了分页数据库的功能。也就是两句话:

query.setFirstResult(pageStartRow); query.setMaxResults(pageSize);

最近开始学Hibernate就写了一个分页的功能,很实用,实现了跳转到相应的页:GO,和用户可选的页面显示数据的数量,与大家分享下,如果有不正确的地方请大家多多指出。谢谢,就不多说废话了.....

首先我们准备一个 Pager.java

view plaincopy to clipboardprint? 01.package com.rao.entitys; 02.

03.import java.util.concurrent.CountDownLatch; 04. 05.

06.public class Pager {

07. private int currentPage; //当前页 08. private int totalRows; //总行数

09. private int pageSartRow; //每页开始的数据行 10. private int totalpages; //总页数

11. private int pageSize; //每页 显示的数据行数量 12.

13. public int getCurrentPage() { 14. return currentPage; 15. } 16.

17. public void setCurrentPage(int currentPage) { 18. this.currentPage = currentPage; 19. } 20.

21. public int getTotalRows() { 22. return totalRows; 23. } 24.

25. public void setTotalRows(int totalRows) { 26. this.totalRows = totalRows; 27. } 28.

29. public int getPageSartRow() { 30. return pageSartRow; 31. }

32.

33. public void setPageSartRow(int pageSartRow) { 34. this.pageSartRow = pageSartRow; 35. } 36.

37. public int getTotalpages() { 38. return totalpages; 39. } 40.

41. public void setTotalpages(int totalpages) { 42. this.totalpages = totalpages; 43. } 44.

45. public int getPageSize() { 46. return pageSize; 47. } 48.

49. public void setPageSize(int pageSize) { 50. this.pageSize = pageSize; 51. } 52. /*

53. * 构造方法,初始化数据 54. */

55. public Pager(int totals,int size){ 56. this.totalRows = totals; 57. this.pageSize = size; 58. //计算总页数,

59. if (totalRows%pageSize!=0) {

60. this.totalpages = totalRows/pageSize+1; 61. }else {

62. this.totalpages = totalRows/pageSize; 63. }

. //默认当前页为第一页 65. this.currentPage = 1; 66. //默认数据的开始为0 67. this.pageSartRow = 0; 68. } 69. /**

70. * 上一页 71. */

72. public void previousPage(){

73. //如果当前页小于等于1,返回 74. if (currentPage<=1) { 75. return;

76. }

77. //当前页减一页 78. currentPage--;

79. //设置每页开始的数据行

80. pageSartRow = (currentPage-1)*pageSize; 81. } 82. /**

83. * 下一页 84. */

85. public void nextPage(){

86. //如果当前页大于总页数,设置当前页为最后一页 87. if (currentPage>=totalpages) { 88. currentPage=totalpages; . }else {

90. //否则当前页加一页 91. currentPage++; 92. }

93. pageSartRow = (currentPage-1)*pageSize; 94. } 95. /**

96. * 首页 97. */

98. public void firsPage(){ 99. currentPage=1;

100. pageSartRow = (currentPage-1)*pageSize; 101. } 102. /**

103. * 尾页 104. */

105. public void lastPage(){

106. currentPage = totalpages;

107. pageSartRow = (currentPage-1)*pageSize; 108. } 109. 110. /** 111. * Go 112. */

113. public void goPage(int go){

114. //当前页等于用户输入跳转的那一页 115. currentPage = go;

116. //如果用户输入的大于总页数,go to last page 117. if (currentPage>=totalpages) { 118. currentPage=totalpages; 119. }else if(currentPage<=1){

120. //if input <= 1, go to first page 121. currentPage=1; 122. }

123. pageSartRow = (currentPage-1)*pageSize; 124. } 125. /**

126. * 设置页面显示的数据条数 127. * @param show 数据条数 128. */

129. public void showcount(int show){ 130. setPageSize(show); 131. } 132. 133.}

package com.rao.entitys;

import java.util.concurrent.CountDownLatch;

public class Pager {

private int currentPage; //当前页 private int totalRows; //总行数

private int pageSartRow; //每页开始的数据行 private int totalpages; //总页数

private int pageSize; //每页 显示的数据行数量

public int getCurrentPage() { return currentPage; }

public void setCurrentPage(int currentPage) { this.currentPage = currentPage; }

public int getTotalRows() { return totalRows; }

public void setTotalRows(int totalRows) { this.totalRows = totalRows; }

public int getPageSartRow() { return pageSartRow;

}

public void setPageSartRow(int pageSartRow) { this.pageSartRow = pageSartRow; }

public int getTotalpages() { return totalpages; }

public void setTotalpages(int totalpages) { this.totalpages = totalpages; }

public int getPageSize() { return pageSize; }

public void setPageSize(int pageSize) { this.pageSize = pageSize; } /*

* 构造方法,初始化数据 */

public Pager(int totals,int size){ this.totalRows = totals; this.pageSize = size; //计算总页数, if (totalRows%pageSize!=0) { this.totalpages = totalRows/pageSize+1; }else { this.totalpages = totalRows/pageSize; } //默认当前页为第一页 this.currentPage = 1; //默认数据的开始为0 this.pageSartRow = 0; } /**

* 上一页 */

public void previousPage(){ //如果当前页小于等于1,返回 if (currentPage<=1) {

return; } //当前页减一页 currentPage--; //设置每页开始的数据行 pageSartRow = (currentPage-1)*pageSize; } /**

* 下一页 */

public void nextPage(){ //如果当前页大于总页数,设置当前页为最后一页 if (currentPage>=totalpages) { currentPage=totalpages; }else { //否则当前页加一页 currentPage++; } pageSartRow = (currentPage-1)*pageSize; } /**

* 首页 */

public void firsPage(){ currentPage=1; pageSartRow = (currentPage-1)*pageSize; } /**

* 尾页 */

public void lastPage(){ currentPage = totalpages; pageSartRow = (currentPage-1)*pageSize; } /** * Go */

public void goPage(int go){ //当前页等于用户输入跳转的那一页 currentPage = go; //如果用户输入的大于总页数,go to last page if (currentPage>=totalpages) { currentPage=totalpages;

}else if(currentPage<=1){ //if input <= 1, go to first page currentPage=1; } pageSartRow = (currentPage-1)*pageSize; } /**

* 设置页面显示的数据条数 * @param show 数据条数 */

public void showcount(int show){ setPageSize(show); } }

然后我们需要一个工具类,用于获得一个Pger对象,在Action中使用:

PagerUtil.java

view plaincopy to clipboardprint? 01.package com.rao.util; 02.

03.import javax.servlet.http.HttpServletRequest; 04.

05.import org.hibernate.Hibernate; 06.

07.import com.rao.entitys.Pager; 08. 09./**

10. * @author raozhiyong 用于得到一个Pager的实例 11. */

12.public class PagerUtil {

13. public static Pager getPager(HttpServletRequest request, int totalRows) { 14. //得到页面传入的pagesize参数,也就是用户选中的值 15. String pageSizesString = request.getParameter(\"showcount\"); 16. int pageSize;

17. //如果这个参数为空的话,说明是第一次浏览,初始化页面默认的pagesize 为五条数据

18. if (pageSizesString==null) { 19. pageSize = 5; 20. }else {

21. //否则讲pageSize属性设置为用户选择的大小

22. pageSize = new Integer(pageSizesString); 23. }

24. //根据数据库中的数据总数和每页显示的pagesize,创建一个初始化的Pager对象

25. Pager pager = new Pager(totalRows,pageSize); 26. // 得到页面传输近来的当前页

27. String current = request.getParameter(\"current\");

28. // 如果传入的参数为空,则访问首页,默认当前页为第一页 29. // 如果不为空就重新设置当前页面的值 30. if (current != null) {

31. pager.setCurrentPage(new Integer(current)); 32. }

33. // 得到用户请求操作,首页,尾页,上一页,下一页 34.

35. String pagedo = request.getParameter(\"pagedo\"); 36. if (pagedo != null) {

37. if (\"first\".equalsIgnoreCase(pagedo)) { 38. pager.firsPage();

39. } else if (\"last\".equalsIgnoreCase(pagedo)) { 40. pager.lastPage();

41. } else if (\"previous\".equalsIgnoreCase(pagedo)) { 42. pager.previousPage();

43. } else if (\"next\".equalsIgnoreCase(pagedo)) { 44. pager.nextPage();

45. } else if (\"go\".equalsIgnoreCase(pagedo)) { 46. //接受用户输入的跳转页

47. String gocount = request.getParameter(\"gocount\");

48. // 初始化为回到第一页(也许用户输入的数据合法,那么这时候我们应当默认回到第一页) 49. int go = 1; 50. try {

51. go = new Integer(gocount); 52. } catch (Exception e) { 53. e.printStackTrace(); 54. }

55. pager.goPage(go);

56. } else if (\"select\".equalsIgnoreCase(pagedo)) {

57. String showcount = request.getParameter(\"showcount\"); 58. // 初始化为每页5条数据 59. int size = 5; 60. try {

61. size = new Integer(showcount); 62. } catch (Exception e) { 63. e.printStackTrace();

. }

65. pager.showcount(size); 66. } 67. }

68. return pager; 69. } 70. 71.}

package com.rao.util;

import javax.servlet.http.HttpServletRequest;

import org.hibernate.Hibernate;

import com.rao.entitys.Pager; /**

* @author raozhiyong 用于得到一个Pager的实例 */

public class PagerUtil {

public static Pager getPager(HttpServletRequest request, int totalRows) { //得到页面传入的pagesize参数,也就是用户选中的值 String pageSizesString = request.getParameter(\"showcount\"); int pageSize; //如果这个参数为空的话,说明是第一次浏览,初始化页面默认的pagesize 为五条数据 if (pageSizesString==null) { pageSize = 5; }else { //否则讲pageSize属性设置为用户选择的大小 pageSize = new Integer(pageSizesString); } //根据数据库中的数据总数和每页显示的pagesize,创建一个初始化的Pager对象 Pager pager = new Pager(totalRows,pageSize); // 得到页面传输近来的当前页 String current = request.getParameter(\"current\"); // 如果传入的参数为空,则访问首页,默认当前页为第一页 // 如果不为空就重新设置当前页面的值 if (current != null) { pager.setCurrentPage(new Integer(current)); } // 得到用户请求操作,首页,尾页,上一页,下一页

String pagedo = request.getParameter(\"pagedo\"); if (pagedo != null) { if (\"first\".equalsIgnoreCase(pagedo)) { pager.firsPage(); } else if (\"last\".equalsIgnoreCase(pagedo)) { pager.lastPage(); } else if (\"previous\".equalsIgnoreCase(pagedo)) { pager.previousPage(); } else if (\"next\".equalsIgnoreCase(pagedo)) { pager.nextPage(); } else if (\"go\".equalsIgnoreCase(pagedo)) { //接受用户输入的跳转页 String gocount = request.getParameter(\"gocount\"); // 初始化为回到第一页(也许用户输入的数据合法,那么这时候我们应当默认回到第一页) int go = 1; try { go = new Integer(gocount); } catch (Exception e) { e.printStackTrace(); } pager.goPage(go); } else if (\"select\".equalsIgnoreCase(pagedo)) { String showcount = request.getParameter(\"showcount\"); // 初始化为每页5条数据 int size = 5; try { size = new Integer(showcount); } catch (Exception e) { e.printStackTrace(); } pager.showcount(size); } } return pager; } }

Struts中Action的代码如下:

view plaincopy to clipboardprint?

01.public ActionForward all(ActionMapping mapping, ActionForm form,

02. HttpServletRequest request, HttpServletResponse response) { 03. System.out.println(\"=========all========\"); 04. String uriString = null; 05.

06. try { 07.

08. // 得到数据的总条数

09. int totalRows = studentDao.totalCount(); 10. //获得一个Pager对象

11. Pager pager = PagerUtil.getPager(request, totalRows); 12. //取出相应的数据 13. List stulist studentDao.selectStudentList(pager.getPageSartRow(),pager.getPageSize()); 14. //将pager对象共享的request作用范围中,以便页面使用 15. request.setAttribute(\"pager\

16. //将查询到的List共享的request作用范围中,以便页面使用 17. request.setAttribute(\"stulist\ 18. uriString = \"list\"; 19. } catch (Exception e) { 20. uriString = \"error\"; 21. e.printStackTrace(); 22. }

23. return mapping.findForward(uriString); 24.}

public ActionForward all(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { System.out.println(\"=========all========\"); String uriString = null; try { // 得到数据的总条数 int totalRows = studentDao.totalCount(); //获得一个Pager对象 Pager pager = PagerUtil.getPager(request, totalRows); //取出相应的数据 List stulist

studentDao.selectStudentList(pager.getPageSartRow(),pager.getPageSize()); //将pager对象共享的request作用范围中,以便页面使用 request.setAttribute(\"pager\ //将查询到的List共享的request作用范围中,以便页面使用 request.setAttribute(\"stulist\ uriString = \"list\"; } catch (Exception e) {

=

=

uriString = \"error\"; e.printStackTrace(); } return mapping.findForward(uriString); }

以上的Action使用了Hibernate中的两个方法:

1.totalCount():得到总数据量;

2.selectStudentList(pager.getPageSartRow(),pager.getPageSize()); 得到请求的List

Hibernate范围中的代码如下:

view plaincopy to clipboardprint? 01./**

02. * 查询所有学生信息 03. */

04.public List selectStudentList(int pageStartRow,int pageSize) { 05. List list = new ArrayList(); 06. try {

07. session = HibernateSessionFactory.getSession(); 08. final String hql = \"from Student\";

09. Query query = session.createQuery(hql); 10. query.setFirstResult(pageStartRow); 11. query.setMaxResults(pageSize); 12. list = query.list();

13. Hibernate.initialize(list); 14.

15. } catch (HibernateException e) { 16. if (transaction!=null) { 17. transaction.rollback(); 18. }

19. e.printStackTrace(); 20. } finally {

21. //session.close(); 22. }

23. return list; 24.} 25. 26.

27.public int totalCount() { 28. int count = 0; 29. try {

30. session = HibernateSessionFactory.getSession(); 31.

32. //HQL Queqy

33. final String hql = \"select count(*) from Student\"; 34. Query query = session.createQuery(hql);

35. //count = ((Number)query.uniqueResult()).intValue(); 36. count = ((Number)query.iterate().next()).intValue(); 37.

38. //QBC Query

39. /*Criteria criteria = session.createCriteria(Student.class); 40. ProjectionList pList = Projections.projectionList(); 41. pList.add(Projections.rowCount()); 42. criteria.setProjection(pList);

43. count = ((Number)criteria.uniqueResult()).intValue();*/ 44. } catch (HibernateException e) { 45. if (transaction!=null) { 46. transaction.rollback(); 47. }

48. e.printStackTrace(); 49. } finally {

50. session.close(); 51. }

52. return count; 53.} /**

* 查询所有学生信息 */

public List selectStudentList(int pageStartRow,int pageSize) { List list = new ArrayList(); try { session = HibernateSessionFactory.getSession(); final String hql = \"from Student\"; Query query = session.createQuery(hql); query.setFirstResult(pageStartRow); query.setMaxResults(pageSize); list = query.list(); Hibernate.initialize(list); } catch (HibernateException e) { if (transaction!=null) { transaction.rollback(); } e.printStackTrace(); } finally {

//session.close(); } return list; }

public int totalCount() { int count = 0; try { session = HibernateSessionFactory.getSession(); //HQL Queqy final String hql = \"select count(*) from Student\"; Query query = session.createQuery(hql); //count = ((Number)query.uniqueResult()).intValue(); count = ((Number)query.iterate().next()).intValue(); //QBC Query /*Criteria criteria = session.createCriteria(Student.class); ProjectionList pList = Projections.projectionList(); pList.add(Projections.rowCount()); criteria.setProjection(pList); count = ((Number)criteria.uniqueResult()).intValue();*/ } catch (HibernateException e) { if (transaction!=null) { transaction.rollback(); } e.printStackTrace(); } finally { session.close(); } return count; }

最后我们来看看前台代码:

view plaincopy to clipboardprint?

01.<%@ page language=\"java\" pageEncoding=\"gbk\"%> 02.

03.<%@ taglib uri=\"http://struts.apache.org/tags-bean\" prefix=\"bean\"%> 04.<%@ taglib uri=\"http://struts.apache.org/tags-html\" prefix=\"html\"%> 05.<%@ taglib uri=\"http://struts.apache.org/tags-logic\" prefix=\"logic\"%> 06.<%@ taglib uri=\"http://struts.apache.org/tags-tiles\" prefix=\"tiles\"%>

07. 08.

09. 10. 11.

12. 13.

14. stuList.jsp 15.

16.

17. 18.

19. 20. 21. 24.

25. 26.

27.

28.

29.

30. 学生信息管理 31.

32. 33.

34. 新增学生信息

35. 36.

37.

38.

41.

44.

48.

51.

54.

58. 59.

60. 61.

62.

63.

67. 71. 75. 79. 83. 92.

93.

94.

95.

39. 编号 40. 42. 姓名 43. 45. 年龄 46.
47.
49. 地址

50.

52. 班级 53. 55. 操作 56.
57.

. 65. 66.

68.

69. 70.

72. 73. 74.

76.

77. 78.

80.

81. 82.

84. 85.

86. 87. paramId=\"stuid\" paramProperty=\"stuId\">修改

88. mce_href=\"stutent.do?dowhat=delete\" paramName=\"stu\"

. paramId=\"stuid\" paramProperty=\"stuId\">删除 90.

91.

96.

140.

141.

142.

151.

158.

159.

160.

167.

192. 193.

143. 共有

144. 条数据 共有

146. 页 当前是第

148.

150.

152.

153. 首页

154. 上一页

155. 下一页

156. 尾页 157.

161. 162. onkeypress=\"return event.keyCode>=48&&event.keyCode<=57||event.keyCode==46\" 163.

onpaste=\"return !clipboardData.getData('text').match(/\\D/)\"

1. ondragenter=\"return false\" style=\"ime-mode: Disabled\" />

165. GO 166.

168. 每页显示

169. 190. 条数据 191.

194. 195. 196.

197. 198.

<%@ page language=\"java\" pageEncoding=\"gbk\"%>

<%@ taglib uri=\"http://struts.apache.org/tags-bean\" prefix=\"bean\"%> <%@ taglib uri=\"http://struts.apache.org/tags-html\" prefix=\"html\"%> <%@ taglib uri=\"http://struts.apache.org/tags-logic\" prefix=\"logic\"%> <%@ taglib uri=\"http://struts.apache.org/tags-tiles\" prefix=\"tiles\"%>

stuList.jsp

学生信息管理

新增学生信息
编号 姓名 年龄
地址 班级 操作

修改 删除
共有 条数据 共有 页 当前是第 首页 上一页 下一页 尾页 event.keyCode>=48&&event.keyCode<=57||event.keyCode==46\"

onpaste=\"return !clipboardData.getData('text').match(/\\D/)\" ondragenter=\"return false\" style=\"ime-mode: Disabled\" /> GO

每页显示 条数据

value=\"5\"

value=\"10\"

value=\"20\"

value=\"30\"

value=\"40\"

value=\"50\"

从jsp页面上可以看到,我把分页模拟成了一个组件化的用例,放在一个table中,我们可以在任何一个项目中使用它,只要能将代码复制即可,当然还要修改下请求的路径,这个就要以项目为中心了,这里的请求我大多是用的javasript,因为我们必须在没有表单的情况下获得用户的输入和选择,所以我选择了JavaScript,当然还有很多方法,大家有兴趣可以去研究。由于我在代码中注释都写得很清楚,所以我在这里只是讲下其中一个路径问题:stutent.do?dowhat=all&pagedo=next¤t=${pager.currentPage}&showcount=\" + count

dowhat : 这是Action的请求,我用的是DispatchAction,这里指的是Action的请求参数;

current :当前页,从request中获得;

showcount: 用户选择的当前显示多少行数据,也就是pager的pageSize;

gocount : 用户输入的转到第几个的数值;

在贴出学习时对分页的分析图片吧:

http://b31.photo.store.qq.com/http_imgload.cgi?/rurl4_b=25b845d29607d32ca11c8a09617bf58b98eb6d2c485aacff502cc045c39bc12e069bea3681c5d7142e01c1ce54705b0698c740fe83c34a8bc4fef145d592f04a7df7e340263f8e4c7ae787515f321b1f26dc&a=25&b=31

还有本例的图样,大家可以先睹为快:

http://b31.photo.store.qq.com/http_imgload.cgi?/rurl4_b=25b845d29607d32ca11c8a09617bf58b1b7471265f322d130cd674d75cc0fb024fff79b1394f042be3cc3104c3c82414dfac42b6a8edc705f556ff996e15d4f4d10233e3b90edcd1c1ffd94321af0177191a7b35&a=31&b=31

就是这么多,希望对大家有所帮助!

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/raozhiyong11/archive/2010/01/16/5200459.aspx

struts+spring+hibernate下通用分页功能的实现 1、定义通用分页model

package cn.com.bank.mmpf.model; import cn.com.bank.mmpf.util.Constants;

/**

* Created by IntelliJ IDEA. * User: willsu

* Date: 2005-6-10 * Time: 16:51:22

* To change this template use File | Settings | File Templates. */

public class PageControl implements java.io.Serializable{ private int pageno=1; //当前页码

private int pagesize=Constants.PAGE_SIZE_DEFALUT; //每页行数 private int rowcount; //总行数 private int pagecount; //总页数

private boolean useprevious;//前一页是否能用 private boolean usebehind;//后一页是否能用 private boolean usepage=true;//是否分页

public int getPageno() { return pageno; }

public void setPageno(int pageno) { this.pageno = pageno; }

public int getPagesize() { return pagesize; }

public void setPagesize(int pagesize) { if (pagesize==0){//0-->不分页 usepage=false; pagecount=1; pageno=1;

useprevious=false; usebehind=false; }

this.pagesize = pagesize; }

public int getRowcount() { return rowcount; }

public void setRowcount(int rowcount) { this.rowcount = rowcount; if(usepage){

pagecount=(rowcount % pagesize ==0 )?(rowcount /pagesize ) : ( rowcount / pagesize +1);

useprevious=pageno==1?false:true;

usebehind=pageno==pagecount?false:true; } }

public int getPagecount() { return pagecount; }

public void setPagecount(int pagecount) { this.pagecount = pagecount; }

public boolean isUseprevious() { return useprevious; }

public void setUseprevious(boolean useprevious) { this.useprevious = useprevious; }

public boolean isUsebehind() { return usebehind; }

public void setUsebehind(boolean usebehind) { this.usebehind = usebehind; }

public boolean isUsepage() { return usepage; }

public void setUsepage(boolean usepage) { this.usepage = usepage; }

}

2、hibernate分页实现函数--〉放在底层类中

public class CommonServiceImpl extends HibernateDaoSupport implements CommonService{ 。。。

//通用分页处理

public List getListForPage(final String hsql,PageControl pageControl) throws Exception

{

List pagelist=null;

Session session=getSession(); try {

pageControl.setRowcount(getTotalCount(session,hsql)); //更新pagecontrol的各种属性 important

if(pageControl.isUsepage()){ //是否分页

// sql=hsql+ \" limit \" + (pageNog-1)*page_size + \+page_size;

// offices= getHibernateTemplate().find(sql); //被屏蔽掉的是原来的处理 //以下是改过的处理方法 Query query=null;

query=session.createQuery(hsql); int

start=(pageControl.getPageno()-1)*pageControl.getPagesize(); int rowNum=pageControl.getPagesize(); query.setFirstResult(start);

query.setMaxResults(rowNum); pagelist = query.list(); }else{

pagelist=session.find(hsql); }

} finally {

session.close(); }

return pagelist; }

//计算表的总行数

private int getTotalCount(Session session, String hql) throws Exception {

Integer amount = new Integer(0); int sql_from = hql.indexOf(\"from\");

int sql_orderby=hql.indexOf(\"order by\");//为了改进 String countStr=\"\"; if(sql_orderby>0) {

countStr=\"select count(*) \"+hql.substring(sql_from,sql_orderby); } else

countStr = \"select count(*) \"+hql.substring(sql_from); Query query = session.createQuery(countStr); if(!query.list().isEmpty()){

amount = (Integer) query.list().get(0);

} else

return 0;

return amount.intValue(); } }

3、实际service对象继承commonserviceimpl

public class LogServiceImpl extends CommonServiceImpl implements LogService{

public List getLogByType(Integer logtype, PageControl pageControl) throws Exception{

String hql=\"from \"+Systemlog.class.getName()+\" as a where a.baselogtype.id=\"+logtype+\" order by a.opertime desc\"; return getListForPage(hql,pageControl); } }

4、action实现

public class LogListAction extends BaseAction{

public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {

String forward =Constants.FORWORD_FIAL; LogService service = (LogService)

getWebApplicationContext().getBean(Constants.LOG_SERVICE);//获得service对象

Object obj=((DynaActionForm)

actionForm).get(Constants.PAGE_CONTROL_MODEL); Object obj1=((DynaActionForm)

actionForm).get(Constants.PAGE_FILTER_ID);

Integer filterid=obj1==null?new Integer(1):(Integer)obj1; PageControl pageControl=obj==null?new PageControl():(PageControl)obj; try {

List mainlist=service.getLogByType(filterid,pageControl); //调用分页方法得到list

List filterlist=service.loadAll(Baselogtype.class); ((DynaActionForm)

actionForm).set(Constants.PAGE_ENTITY_LIST, mainlist); ((DynaActionForm)

actionForm).set(Constants.PAGE_FILTER_LIST, filterlist);

((DynaActionForm)

actionForm).set(Constants.PAGE_FILTER_ID,filterid); ((DynaActionForm)

actionForm).set(Constants.PAGE_CONTROL_MODEL,pageControl); forward = Constants.FORWORD_SUCCESS; } catch (Exception e) {

ActionErrors errors = new ActionErrors();

errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(Constants.ERROR_LIST,e.getMessage())); saveErrors(request, errors); }

return actionMapping.findForward(forward); } }

5、jsp页面

5.1、分页部分代码:

 共页  每页行数

property=\"pagecontrolmodel.pagesize\" styleClass=\"DropDownList\" style=\"width:80px\" onchange=\"refresh()\">

不分页 10行 20行 30行 50行 100行

 首页  property=\"pagecontrolmodel.pageno\" name=\"LogListForm\"/>-1)\">前一页

 首页  前一页

 property=\"pagecontrolmodel.pageno\" name=\"LogListForm\"/>+1)\">后一页

 property=\"pagecontrolmodel.pagecount\" name=\"LogListForm\"/>)\">末页

 后一页  末页

 跳至

5.2、分页实现配套javascript

通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:

1、QBE(Qurey By Example)检索方式

QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。 Java代码 1. /**

2. * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录 3. * @param pageNo 4. * 当前页数 5. * @param pageSize

6. * 每页显示的记录数

7. * @param object

8. * 将查询条件封装为Object 9. * @return 将查询结果封装为Pager返回 10. 11.

*/

public Pager findPageByExample(int pageNo, i

nt pageSize, Object object) 12. 13. 14. 15. 16.

{

Pager pager = null; try {

Criteria criteria = this.getSession(

).createCriteria( 17.

Class.forName(this.getEntity

())); 18. 19. 20. 21.

if (object != null) {

criteria.add(Example.create(obje

ct).enableLike()); 22. 23. 24.

}

// 获取根据条件分页查询的总行数

25. int rowCount = (Integer) criteria.se

tProjection( 26.

Projections.rowCount()).uniq

ueResult(); 27. 28. 29.

criteria.setProjection(null);

criteria.setFirstResult((pageNo - 1)

* pageSize); 30. 31. 32. 33. 34.

criteria.setMaxResults(pageSize);

List result = criteria.list();

pager = new Pager(pageSize, pageNo,

rowCount, result); 35. 36. 37. 38. 39. 40. 41. 42.

} catch (RuntimeException re) {

throw re; } finally {

return pager; }

43. 44.

}

注意代码的第20行,即

criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。

在BO层将需要模糊查询的列用\"%%\"串起来,不然仍然和\"=\"一样。 BO层代码: Java代码 1. /**

2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录 3. * @param pageNo

4. * 当前的页码 5. * @param pageSize

6. * 每页显示的记录数 7. * @param mendName

8. * 抢修人员的名称 9. * @param specialty

10. 11. 12. 13.

* 抢修人员的工种 * @param post

* 抢修人员的职称

* @return 将符合条件的记录数以及页码信息封

装成PagerBean返回 14. 15.

*/

public Pager getInfoByQuery(int pageNo, int

pageSize, String mendName, 16. 17. 18. 19. 20.

String specialty, String post) {

EicMend eicMend = new EicMend(); if (mendName != null && mendName.length(

) > 0) 21. 22.

{

eicMend.setMendname(\"%\" + mendName +

\"%\"); 23. 24.

}

if (specialty != null && specialty.lengt

h() > 0) 25. 26.

{

eicMend.setSpecialty(specialty);

27. 28. 29. 30. 31. 32. 33. 34.

}

if (post != null && post.length() > 0)

{

eicMend.setPost(post); }

Pager pager = erpManagerDao

.findPageByExample(pageNo, pageS

ize, eicMend); 35. 36.

执行SQL语句如下: Sql代码

return pager; }

1. Hibernate: select count(*) as y0_ from YJZX.EIC_MEND this_ where

2. (this_.MENDNAME like ? and this_.POST like ?) 3.

4. Hibernate: select * from ( select this_.MENDID as MENDID23_0_, „„

5. this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where

6. (this_.MENDNAME like ? and this_.POST like ?) ) where rownum <= ?

所以只需将需模糊查询的列用“%%”链接即可。

2、QBC(Qurey By Criteria)检索方式

采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Restrictions接口组成,它支持在运行时动态生成查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用Criterion„不定参数传参。 Map传参方式范例如下: DAO层: Java代码 1. /**

2. * @function 分页显示符合所有的记录数,将查询结果封装为Pager 3. * @param pageNo 4. * 当前页数 5. * @param pageSize

6. * 每页显示的条数 7. * @param map

8. * 将查询条件封装为map 9. * @return 查询结果Pager 10. 11.

*/

public Pager findPageByCriteria(int pageNo,

int pageSize, Map map) 12. 13. 14. 15. 16.

{

Pager pager = null; try {

Criteria criteria = this.getSession(

).createCriteria( 17.

Class.forName(this.getEntity

())); 18. 19.

if (map != null)

20. 21.

{

Set keys = map.keySet();

22. 23. 24.

for (String key : keys) {

criteria.add(Restrictions.li

ke(key, map.get(key))); 25. 26. 27. 28. 29.

} }

// 获取根据条件分页查询的总行数 int rowCount = (Integer) criteria.se

tProjection( 30.

Projections.rowCount()).uniq

ueResult(); 31. 32. 33.

criteria.setProjection(null);

criteria.setFirstResult((pageNo - 1)

* pageSize); 34. 35. 36.

criteria.setMaxResults(pageSize);

List result = criteria.list();

37. 38.

pager = new Pager(pageSize, pageNo,

rowCount, result); 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.

Map传参方式对应BO层代码: Java代码 1. /**

2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录 3. * @param pageNo

4. * 当前的页码

} catch (RuntimeException re) {

throw re; } finally {

return pager; } }

5. * @param pageSize

6. * 每页显示的记录数 7. * @param mendName

8. * 抢修人员的名称 9. * @param specialty 10. 11. 12. 13.

* 抢修人员的工种 * @param post

* 抢修人员的职称

* @return 将符合条件的记录数以及页码信息封

装成PagerBean返回 14. 15.

*/

public Pager getInfoByQuery2(int pageNo, int

pageSize, String mendName, 16. 17. 18. 19. 20. 21.

String specialty, String post) {

Map map = new HashMap();

if (mendName != null && mendName.length(

) > 0) 22.

{

23. map.put(\"mendname\

\"%\"); 24. 25.

}

if (specialty != null && specialty.lengt

h() > 0) 26. 27. 28. 29. 30. 31. 32. 33. 34.

{

map.put(\"post\ }

Pager pager = erpManagerDao.findPageByCr {

map.put(\"specialty\ }

if (post != null && post.length() > 0)

iteria(pageNo, pageSize, map); 35. 36.

第二种方式:Criterion„不定参数传参方式。其代码如下所示: DAO层代码:

return pager; }

Java代码 1. /**

2. * @function 分页显示符合所有的记录数,将查询结果封装为Pager 3. * @param pageNo 4. * 当前页数 5. * @param pageSize

6. * 每页显示的条数 7. * @param criterions

8. * 不定参数Criterion 9. * @return 查询结果Pager 10. 11.

*/

public Pager findPageByCriteria(int pageNo,

int pageSize, 12. 13. 14. 15. 16. 17.

Criterion... criterions) {

Pager pager = null; try {

Criteria criteria = this.getSession(

).createCriteria(

18. Class.forName(this.getEntity

())); 19. 20. 21.

if (criterions != null) {

for (Criterion criterion : crite

rions) 22. 23. 24. 25.

{

if (criterion != null) {

criteria.add(criterion);

26. 27. 28. 29. 30. 31. 32.

}

} }

// 获取根据条件分页查询的总行数 int rowCount = (Integer) criteria.se

tProjection( 33.

Projections.rowCount()).uniq

ueResult(); 34.

criteria.setProjection(null);

35. 36.

criteria.setFirstResult((pageNo - 1)

* pageSize); 37. 38. 39. 40. 41.

criteria.setMaxResults(pageSize);

List result = criteria.list();

pager = new Pager(pageSize, pageNo,

rowCount, result); 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.

Criterion„不定参数传参方式对应BO层代码: Java代码

} catch (RuntimeException re) {

throw re; } finally {

return pager; } }

1. /**

2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录 3. * @param pageNo

4. * 当前的页码 5. * @param pageSize

6. * 每页显示的记录数 7. * @param mendName

8. * 抢修人员的名称 9. * @param specialty 10. 11. 12. 13.

* 抢修人员的工种 * @param post

* 抢修人员的职称

* @return 将符合条件的记录数以及页码信息封

装成PagerBean返回 14. 15.

*/

public Pager getInfoByQuery3(int pageNo, int

pageSize, String mendName, 16. 17. 18.

String specialty, String post) {

Criterion criterion1 = null, criterion2

= null, criterion3 = null;

19. if (mendName != null && mendName.length(

) > 0) 20. 21.

{

criterion1 = Restrictions.ilike(\"men

dname\22. 23. 24. 25.

MatchMode.ANYWHERE); }

if (specialty != null && specialty.lengt

h() > 0) 26. 27.

{

criterion2 = Restrictions.ilike(\"spe

cialty\28. 29. 30. 31. 32. 33.

{

criterion3 = Restrictions.ilike(\"pos MatchMode.EXACT); }

if (post != null && post.length() > 0)

t\34.

}

35. 36.

Pager pager = erpManagerDao.findPageByCr

iteria(pageNo, pageSize, 37.

criterion1, criterion2, criterio

n3); 38. 39. 40.

3、HQL检索方式

HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。 使用Query接口分页查询DAO代码: Java代码 1. /**

2. * @function 分页显示符合所有的记录数,将查询结果封装为Pager 3. * @param pageNo 4. * 当前页数

return pager; }

5. * @param pageSize

6. * 每页显示的条数 7. * @param instance

8. * 将查询条件封装为专家Bean 9. * @return 查询结果Pager 10. 11.

*/

public List findPageByQuery(int page

No, int pageSize, String hql, 12. 13. 14. 15. 16. 17.

Map map) {

List result = null; try {

Query query = this.getSession().crea

teQuery(hql); 18. 19.

Iterator it = map.keySet().iterator(

); 20. 21. 22.

while (it.hasNext()) {

Object key = it.next();

23. query.setParameter(key.toString(

), map.get(key)); 24. 25. 26.

}

query.setFirstResult((pageNo - 1) *

pageSize); 27. query.setMaxResults(pageSize); 28.

29. result = query.list(); 30.

31. } catch (RuntimeException re) 32. {

33. throw re; 34. }

35. return result; 36. }

查询所有记录数的DAO代码: Java代码

1. /**

2. * @function 根据查询条件查询记录数的个数

3. * @param hql

4. * hql查询语句 5. * @param map

6. * 用map封装查询条件

7. * @return 数据库中满足查询条件的数据的条数 8. */

9. public int getTotalCount(String hql, Map map) 10. 11. 12. 13.

{ try {

Query query = this.getSession().crea

teQuery(hql); 14. 15.

Iterator it = map.keySet().iterator(

); 16. 17. 18. 19.

while (it.hasNext()) {

Object key = it.next(); query.setParameter(key.toString(

), map.get(key)); 20.

}

21. 22.

Integer i = (Integer) query.list().g

et(0); 23. return i;

24. } catch (RuntimeException re) 25. {

26. throw re; 27. } 28. 29. }

BO层代码: Java代码

1. /**

2. * @function 将传递过来的参数封装成专家Bean,分页查询符合条件的记录 3. * @param pageNo

4. * 当前的页码 5. * @param pageSize

6. * 每页显示的记录数 7. * @param expertName

8. * 专家的名称 9. * @param expertSpecialty 10. 11. 12. 13.

* 专家的专业类别 * @param post

* 专家的行政职位

* @return 将符合条件的记录数以及页码信息封

装成PagerBean返回 14. 15.

*/

public Pager getInfoByQuery(int pageNo, int

pageSize, String expertName, 16.

String expertSpecialty, String post)

17. 18. 19.

hql.append(\"select count(expertid) from {

StringBuffer hql = new StringBuffer();

EicExpert where 1=1 \"); 20. 21. 22. 23.

Map map = new HashMap();

if (expertName != null && expertName.len

gth() > 0)

24. 25.

{

map.put(\"expertname\

me + \"%\"); 26.

hql.append(\"and expertname like :exp

ertname \"); 27. 28.

}

if (expertSpecialty != null && expertSpe

cialty.length() > 0) 29. 30.

{

map.put(\"expertspecialty\

cialty); 31.

hql.append(\"and expertspecialty like

:expertspecialty \"); 32. 33. 34. 35. 36. 37. 38.

} {

map.put(\"post\

hql.append(\"and post like :post \"); }

if (post != null && post.length() > 0)

39. 40.

String queryHql = hql.substring(22); List result = erpManagerDao.findPageByQu

ery(pageNo, pageSize, 41. 42.

queryHql, map);

int rowCount = erpManagerDao.getTotalCou

nt(hql.toString(), map); 43. 44.

Pager pager = new Pager(pageSize, pageNo

, rowCount, result); 45. 46.

注:Pager类是我封装的一个分页类,包含 每页显示记录数,当前页,总记录数,每页显示数据的集合。因无关紧要,没有贴出来。另外我不知道Query接口有没有类似于Criteria那样可以直接在分页查询记录的同时查询出总记录条数,知道的大虾麻烦告诉下哈。在BO里设置不定参数的时候感觉也不太好,不知道大虾们可有比较好的办法。

return pager; }

因篇幅问题不能全部显示,请点此查看更多更全内容