基于hibernate实现的分页技术实例分析
本文实例讲述了基于hibernate实现的分页技术。分享给大家供大家参考,具体如下:
先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最大的返回结果即可
先上代码:注意传进来的参数有 Page这类,后面有介绍
public List<Article> queryByPage(final String username, final Page page) { return this.getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery("select art from Article art where art.username = ?"); //设置参数 query.setParameter(0, username); //设置每页显示多少个,设置多大结果。 query.setMaxResults(page.getEveryPage()); //设置起点 query.setFirstResult(page.getBeginIndex()); return query.list(); } });
上面关键代码是 setMaxResults(),和setFirstResult(),即设置最大显示值和起点
这里我们需要一个Page工具类,用来操作分页。
Page.java:
package com.fenye; public class Page { // 1.每页显示数量(everyPage) private int everyPage; // 2.总记录数(totalCount) private int totalCount; // 3.总页数(totalPage) private int totalPage; // 4.当前页(currentPage) private int currentPage; // 5.起始点(beginIndex) private int beginIndex; // 6.是否有上一页(hasPrePage) private boolean hasPrePage; // 7.是否有下一页(hasNextPage) private boolean hasNextPage; public Page(int everyPage, int totalCount, int totalPage, int currentPage, int beginIndex, boolean hasPrePage, boolean hasNextPage) { this.everyPage = everyPage; this.totalCount = totalCount; this.totalPage = totalPage; this.currentPage = currentPage; this.beginIndex = beginIndex; this.hasPrePage = hasPrePage; this.hasNextPage = hasNextPage; } //构造函数,默认 public Page(){} //构造方法,对所有属性进行设置 public int getEveryPage() { return everyPage; } public void setEveryPage(int everyPage) { this.everyPage = everyPage; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getBeginIndex() { return beginIndex; } public void setBeginIndex(int beginIndex) { this.beginIndex = beginIndex; } public boolean isHasPrePage() { return hasPrePage; } public void setHasPrePage(boolean hasPrePage) { this.hasPrePage = hasPrePage; } public boolean isHasNextPage() { return hasNextPage; } public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } }
Page工具类主要是封装页面信息,一共多少数据啊,一页显示多少啊,起点的序号,总页数,是否有上一页下一页,当前页。
还需要一个操作page的工具类,PageUtil.java
package com.sanqing.fenye; /* * 分页信息辅助类 */ public class PageUtil { public static Page createPage(int everyPage,int totalCount,int currentPage) { everyPage = getEveryPage(everyPage); currentPage = getCurrentPage(currentPage); int totalPage = getTotalPage(everyPage, totalCount); int beginIndex = getBeginIndex(everyPage, currentPage); boolean hasPrePage = getHasPrePage(currentPage); boolean hasNextPage = getHasNextPage(totalPage, currentPage); return new Page(everyPage, totalCount, totalPage, currentPage, beginIndex, hasPrePage, hasNextPage); } public static Page createPage(Page page,int totalCount) { int everyPage = getEveryPage(page.getEveryPage()); int currentPage = getCurrentPage(page.getCurrentPage()); int totalPage = getTotalPage(everyPage, totalCount); int beginIndex = getBeginIndex(everyPage, currentPage); boolean hasPrePage = getHasPrePage(currentPage); boolean hasNextPage = getHasNextPage(totalPage, currentPage); return new Page(everyPage, totalCount, totalPage, currentPage, beginIndex, hasPrePage, hasNextPage); } //设置每页显示记录数 public static int getEveryPage(int everyPage) { return everyPage == 0 ? 10 : everyPage; } //设置当前页 public static int getCurrentPage(int currentPage) { return currentPage == 0 ? 1 : currentPage; } //设置总页数,需要总记录数,每页显示多少 public static int getTotalPage(int everyPage,int totalCount) { int totalPage = 0; if(totalCount % everyPage == 0) { totalPage = totalCount / everyPage; } else { totalPage = totalCount / everyPage + 1; } return totalPage; } //设置起始点,需要每页显示多少,当前页 public static int getBeginIndex(int everyPage,int currentPage) { return (currentPage - 1) * everyPage; } //设置是否有上一页,需要当前页 public static boolean getHasPrePage(int currentPage) { return currentPage == 1 ? false : true; } //设置是否有下一个,需要总页数和当前页 public static boolean getHasNextPage(int totalPage, int currentPage) { return currentPage == totalPage || totalPage == 0 ? false : true; } }
创建Page只需要3个参数,每页显示多少数据,当前页,总共多少数据,其他的4个参数都可以通过这三个计算出来
所以后面要创建Page,只需要调用这工具方法PageUtil.createPage(3个参数),就返回一Page.
返回的Page就是前面参数的Page,即要显示的分页
这样就算完成了分页的功能。
希望本文所述对大家基于Hibernate框架的Java程序设计有所帮助。
- 深入解析Java的Hibernate框架中的持久对象
- Java的Hibernate框架中的基本映射用法讲解
- Java Hibernate中使用HQL语句进行数据库查询的要点解析
- Java的Hibernate框架中一对多的单向和双向关联映射
- Java的Hibernate框架中的双向主键关联与双向外键关联
- 全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制
- 解决Hibernate4执行save()或update()无效问题的方法
- SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示
- Spring,hibernate,struts经典面试笔试题(含答案)
- 扩展Hibernate使用自定义数据库连接池的方法
- Hibernate延迟加载原理与实现方法
- Hibernate延迟加载技术详解
- hibernate批量操作实例详解
- Hibernate的Annotation版Hello world实例
- MyBatis与Hibernate的比较
- 详解Java的Hibernate框架中的Interceptor和Collection
- Java的Hibernate框架结合MySQL的入门学习教程
相关文章
解决maven项目tomcat启动失败war exploded:Error during
在SpringMVC项目中,使用war和warexploded两种部署方式可能会导致不同的路径问题,从而出现404错误,war模式将项目打包上传,而warexploded模式则保持文件夹结构上传,开发时建议使用warexploded模式,方便利用Update classes and resources功能自动更新2024-10-10Java Iterator迭代器与foreach循环代码解析
这篇文章主要介绍了Java-Iterator迭代器与foreach循环,主要包括Iterator迭代器接口的操作方法和foreach 循环语法解析,需要的朋友可以参考下2022-04-04spring cloud zuul 与 sentinel的结合使用操作
这篇文章主要介绍了spring cloud zuul 与 sentinel 的结合使用操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06基于mybatis-plus-generator实现代码自动生成器
这篇文章专门为小白准备了入门级mybatis-plus-generator代码自动生成器,可以提高开发效率。文中的示例代码讲解详细,感兴趣的可以了解一下2022-05-05SpringBoot实现Server-Sent Events(SSE)的使用完整指南
使用SpringBoot实现Server-Sent Events(SSE)可以有效处理实时数据推送需求,具有单向通信、轻量级和高实时性等优势,本文详细介绍了在SpringBoot中创建SSE端点的步骤,并通过代码示例展示了客户端如何接收数据,适用于实时通知、数据展示和在线聊天等场景2024-09-09
最新评论