基于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实现的分页技术

相关文章:

你感兴趣的文章:

标签云: