您的位置:首页 > 其它

基于hibernate实现的分页技术

2016-07-08 09:18 453 查看
先说明一下基于hibernate实现分页的原理,假如从数据库取出100条数据,我们要让每页显示10条,假如从30开始,只需要设置起始位置和最大的返回结果即可

先上代码:注意传进来的参数有 Page这类,后面有介绍

[javascript] view
plain copy

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

[java] view
plain copy

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

[javascript] view
plain copy

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,即要显示的分页

这样就算完成了分页的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: