在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

基于hibernate实现的分页技术实例分析

2016-8-29 13:50| 发布者: zhangjf| 查看: 646| 评论: 0

摘要: 本文实例讲述了基于hibernate实现的分页技术。分享给大家供大家参考,具体如下: 先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最 ...

本文实例讲述了基于hibernate实现的分页技术。分享给大家供大家参考,具体如下:

先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最大的返回结果即可
先上代码:注意传进来的参数有 Page这类,后面有介绍

  1. public List<Article> queryByPage(final String username, final Page page) {
  2. return this.getHibernateTemplate().executeFind(new HibernateCallback() {
  3. public Object doInHibernate(Session session)
  4. throws HibernateException, SQLException {
  5. Query query = session.createQuery("select art from Article art where art.username = ?");
  6. //设置参数
  7. query.setParameter(0, username);
  8. //设置每页显示多少个,设置多大结果。
  9. query.setMaxResults(page.getEveryPage());
  10. //设置起点
  11. query.setFirstResult(page.getBeginIndex());
  12. return query.list();
  13. }
  14. });
复制代码

上面关键代码是 setMaxResults(),和setFirstResult(),即设置最大显示值和起点

这里我们需要一个Page工具类,用来操作分页。

Page.java:

  1. package com.fenye;
  2. public class Page {
  3. // 1.每页显示数量(everyPage)
  4. private int everyPage;
  5. // 2.总记录数(totalCount)
  6. private int totalCount;
  7. // 3.总页数(totalPage)
  8. private int totalPage;
  9. // 4.当前页(currentPage)
  10. private int currentPage;
  11. // 5.起始点(beginIndex)
  12. private int beginIndex;
  13. // 6.是否有上一页(hasPrePage)
  14. private boolean hasPrePage;
  15. // 7.是否有下一页(hasNextPage)
  16. private boolean hasNextPage;
  17. public Page(int everyPage, int totalCount, int totalPage, int currentPage,
  18. int beginIndex, boolean hasPrePage, boolean hasNextPage) {
  19. this.everyPage = everyPage;
  20. this.totalCount = totalCount;
  21. this.totalPage = totalPage;
  22. this.currentPage = currentPage;
  23. this.beginIndex = beginIndex;
  24. this.hasPrePage = hasPrePage;
  25. this.hasNextPage = hasNextPage;
  26. }
  27. //构造函数,默认
  28. public Page(){}
  29. //构造方法,对所有属性进行设置
  30. public int getEveryPage() {
  31. return everyPage;
  32. }
  33. public void setEveryPage(int everyPage) {
  34. this.everyPage = everyPage;
  35. }
  36. public int getTotalCount() {
  37. return totalCount;
  38. }
  39. public void setTotalCount(int totalCount) {
  40. this.totalCount = totalCount;
  41. }
  42. public int getTotalPage() {
  43. return totalPage;
  44. }
  45. public void setTotalPage(int totalPage) {
  46. this.totalPage = totalPage;
  47. }
  48. public int getCurrentPage() {
  49. return currentPage;
  50. }
  51. public void setCurrentPage(int currentPage) {
  52. this.currentPage = currentPage;
  53. }
  54. public int getBeginIndex() {
  55. return beginIndex;
  56. }
  57. public void setBeginIndex(int beginIndex) {
  58. this.beginIndex = beginIndex;
  59. }
  60. public boolean isHasPrePage() {
  61. return hasPrePage;
  62. }
  63. public void setHasPrePage(boolean hasPrePage) {
  64. this.hasPrePage = hasPrePage;
  65. }
  66. public boolean isHasNextPage() {
  67. return hasNextPage;
  68. }
  69. public void setHasNextPage(boolean hasNextPage) {
  70. this.hasNextPage = hasNextPage;
  71. }
  72. }
复制代码

Page工具类主要是封装页面信息,一共多少数据啊,一页显示多少啊,起点的序号,总页数,是否有上一页下一页,当前页。

还需要一个操作page的工具类,PageUtil.java

  1. package com.sanqing.fenye;
  2. /*
  3. * 分页信息辅助类
  4. */
  5. public class PageUtil {
  6. public static Page createPage(int everyPage,int totalCount,int currentPage) {
  7. everyPage = getEveryPage(everyPage);
  8. currentPage = getCurrentPage(currentPage);
  9. int totalPage = getTotalPage(everyPage, totalCount);
  10. int beginIndex = getBeginIndex(everyPage, currentPage);
  11. boolean hasPrePage = getHasPrePage(currentPage);
  12. boolean hasNextPage = getHasNextPage(totalPage, currentPage);
  13. return new Page(everyPage, totalCount, totalPage, currentPage,
  14. beginIndex, hasPrePage, hasNextPage);
  15. }
  16. public static Page createPage(Page page,int totalCount) {
  17. int everyPage = getEveryPage(page.getEveryPage());
  18. int currentPage = getCurrentPage(page.getCurrentPage());
  19. int totalPage = getTotalPage(everyPage, totalCount);
  20. int beginIndex = getBeginIndex(everyPage, currentPage);
  21. boolean hasPrePage = getHasPrePage(currentPage);
  22. boolean hasNextPage = getHasNextPage(totalPage, currentPage);
  23. return new Page(everyPage, totalCount, totalPage, currentPage,
  24. beginIndex, hasPrePage, hasNextPage);
  25. }
  26. //设置每页显示记录数
  27. public static int getEveryPage(int everyPage) {
  28. return everyPage == 0 ? 10 : everyPage;
  29. }
  30. //设置当前页
  31. public static int getCurrentPage(int currentPage) {
  32. return currentPage == 0 ? 1 : currentPage;
  33. }
  34. //设置总页数,需要总记录数,每页显示多少
  35. public static int getTotalPage(int everyPage,int totalCount) {
  36. int totalPage = 0;
  37. if(totalCount % everyPage == 0) {
  38. totalPage = totalCount / everyPage;
  39. } else {
  40. totalPage = totalCount / everyPage + 1;
  41. }
  42. return totalPage;
  43. }
  44. //设置起始点,需要每页显示多少,当前页
  45. public static int getBeginIndex(int everyPage,int currentPage) {
  46. return (currentPage - 1) * everyPage;
  47. }
  48. //设置是否有上一页,需要当前页
  49. public static boolean getHasPrePage(int currentPage) {
  50. return currentPage == 1 ? false : true;
  51. }
  52. //设置是否有下一个,需要总页数和当前页
  53. public static boolean getHasNextPage(int totalPage, int currentPage) {
  54. return currentPage == totalPage || totalPage == 0 ? false : true;
  55. }
  56. }
复制代码

创建Page只需要3个参数,每页显示多少数据,当前页,总共多少数据,其他的4个参数都可以通过这三个计算出来

所以后面要创建Page,只需要调用这工具方法PageUtil.createPage(3个参数),就返回一Page.

返回的Page就是前面参数的Page,即要显示的分页

这样就算完成了分页的功能。

希望本文所述对大家基于Hibernate框架的java程序设计有所帮助。

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-7 06:42

Copyright 2015-2025 djqfx

返回顶部