先說明一下基於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的工具類,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,只需要調用這工具方法PageUtil.createPage(3個參數),就返回一Page.
返回的Page就是前面參數的Page,即要顯示的分頁
這樣就算完成了分頁的功能。