先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最大的返回结果即可
先上代码:注意传进来的参数有 Page这类,后面有介绍
- publicList<Article>queryByPage(finalStringusername,finalPagepage){
- returnthis.getHibernateTemplate().executeFind(newHibernateCallback(){
- publicObjectdoInHibernate(Sessionsession)
- throwsHibernateException,SQLException{
- Queryquery=session.createQuery("selectartfromArticleartwhereart.username=?");
- //设置参数
- query.setParameter(0,username);
- //设置每页显示多少个,设置多大结果。
- query.setMaxResults(page.getEveryPage());
- //设置起点
- query.setFirstResult(page.getBeginIndex());
- returnquery.list();
- }
- });
上面关键代码是setMaxResults(),和setFirstResult(),即设置最大显示值和起点
这里我们需要一个Page工具类,用来操作分页。
Page.java
- packagecom.fenye;
- publicclassPage{
- //1.每页显示数量(everyPage)
- privateinteveryPage;
- //2.总记录数(totalCount)
- privateinttotalCount;
- //3.总页数(totalPage)
- privateinttotalPage;
- //4.当前页(currentPage)
- privateintcurrentPage;
- //5.起始点(beginIndex)
- privateintbeginIndex;
- //6.是否有上一页(hasPrePage)
- privatebooleanhasPrePage;
- //7.是否有下一页(hasNextPage)
- privatebooleanhasNextPage;
- publicPage(inteveryPage,inttotalCount,inttotalPage,intcurrentPage,
- intbeginIndex,booleanhasPrePage,booleanhasNextPage){
- this.everyPage=everyPage;
- this.totalCount=totalCount;
- this.totalPage=totalPage;
- this.currentPage=currentPage;
- this.beginIndex=beginIndex;
- this.hasPrePage=hasPrePage;
- this.hasNextPage=hasNextPage;
- }
- //构造函数,默认
- publicPage(){}
- //构造方法,对所有属性进行设置
- publicintgetEveryPage(){
- returneveryPage;
- }
- publicvoidsetEveryPage(inteveryPage){
- this.everyPage=everyPage;
- }
- publicintgetTotalCount(){
- returntotalCount;
- }
- publicvoidsetTotalCount(inttotalCount){
- this.totalCount=totalCount;
- }
- publicintgetTotalPage(){
- returntotalPage;
- }
- publicvoidsetTotalPage(inttotalPage){
- this.totalPage=totalPage;
- }
- publicintgetCurrentPage(){
- returncurrentPage;
- }
- publicvoidsetCurrentPage(intcurrentPage){
- this.currentPage=currentPage;
- }
- publicintgetBeginIndex(){
- returnbeginIndex;
- }
- publicvoidsetBeginIndex(intbeginIndex){
- this.beginIndex=beginIndex;
- }
- publicbooleanisHasPrePage(){
- returnhasPrePage;
- }
- publicvoidsetHasPrePage(booleanhasPrePage){
- this.hasPrePage=hasPrePage;
- }
- publicbooleanisHasNextPage(){
- returnhasNextPage;
- }
- publicvoidsetHasNextPage(booleanhasNextPage){
- this.hasNextPage=hasNextPage;
- }
- }
还需要一个操作page的工具类,PageUtil.java
- packagecom.sanqing.fenye;
- /*
- *分页信息辅助类
- */
- publicclassPageUtil{
- publicstaticPagecreatePage(inteveryPage,inttotalCount,intcurrentPage){
- everyPage=getEveryPage(everyPage);
- currentPage=getCurrentPage(currentPage);
- inttotalPage=getTotalPage(everyPage,totalCount);
- intbeginIndex=getBeginIndex(everyPage,currentPage);
- booleanhasPrePage=getHasPrePage(currentPage);
- booleanhasNextPage=getHasNextPage(totalPage,currentPage);
- returnnewPage(everyPage,totalCount,totalPage,currentPage,
- beginIndex,hasPrePage,hasNextPage);
- }
- publicstaticPagecreatePage(Pagepage,inttotalCount){
- inteveryPage=getEveryPage(page.getEveryPage());
- intcurrentPage=getCurrentPage(page.getCurrentPage());
- inttotalPage=getTotalPage(everyPage,totalCount);
- intbeginIndex=getBeginIndex(everyPage,currentPage);
- booleanhasPrePage=getHasPrePage(currentPage);
- booleanhasNextPage=getHasNextPage(totalPage,currentPage);
- returnnewPage(everyPage,totalCount,totalPage,currentPage,
- beginIndex,hasPrePage,hasNextPage);
- }
- //设置每页显示记录数
- publicstaticintgetEveryPage(inteveryPage){
- returneveryPage==0?10:everyPage;
- }
- //设置当前页
- publicstaticintgetCurrentPage(intcurrentPage){
- returncurrentPage==0?1:currentPage;
- }
- //设置总页数,需要总记录数,每页显示多少
- publicstaticintgetTotalPage(inteveryPage,inttotalCount){
- inttotalPage=0;
- if(totalCount%everyPage==0){
- totalPage=totalCount/everyPage;
- }else{
- totalPage=totalCount/everyPage+1;
- }
- returntotalPage;
- }
- //设置起始点,需要每页显示多少,当前页
- publicstaticintgetBeginIndex(inteveryPage,intcurrentPage){
- return(currentPage-1)*everyPage;
- }
- //设置是否有上一页,需要当前页
- publicstaticbooleangetHasPrePage(intcurrentPage){
- returncurrentPage==1?false:true;
- }
- //设置是否有下一个,需要总页数和当前页
- publicstaticbooleangetHasNextPage(inttotalPage,intcurrentPage){
- returncurrentPage==totalPage||totalPage==0?false:true;
- }
- }
所以后面要创建Page,只需要调用这工具方法PageUtil.createPage(3个参数),就返回一Page.
返回的Page就是前面参数的Page,即要显示的分页
这样就算完成了分页的功能。