本文實例講述了基於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程序設計有所幫助。