今天周一,趁工作輕松,自己就寫了一個基於MySQl數據庫的分頁查詢,做分頁,最主要的是以下幾點:
一:寫sql語句:比如查詢某張數據表的數據,sql語句為:select * from table limit 0,10
焦點就是limit這個限制條件,它的功能是:從0開始查詢10條數據,表示你要在你的顯示頁面上顯示10條數據,就是說你數據庫表里面有15條,那只能顯示10條,剩余5條數據
只能在下一頁中顯示。
同時需要查詢數據庫表中的數據總數:select count(*) from table , 用於獲取數據的總頁數。詳細的介紹在代碼中有解析。
二:要有一個類用來專門處理分頁功能:Pages.java;這個不多說,直接上代碼,在代碼中有詳細的注釋:
package com.utis.util; import java.util.List; public class Page<T> { private int pageSize =10; //每頁顯示條數 private int totalCount; //總條數 private int start; //開始條數 private int pageNo;//當前頁 private int totalPages; //總頁數 private List<T> pageList;//數據 public Page(int totalCount){ this.totalCount = totalCount; } /** * ��ȡ��ǰ獲取��下一條 */ public int getCurrentPageNo(){ return start / pageSize + 1; } /** * �Ƿ�����是否有下一條 * @return */ public boolean getHasNextPage(){ return getCurrentPageNo() < totalPages; } /** * �Ƿ�����當前頁是否大於1 * @return */ public boolean getHasPavPage(){ return getCurrentPageNo() > 1; } /** * ��ȡ��獲取中頁數�� * @return */ public int getTotalPages() { totalPages = totalCount / pageSize; if(totalCount % pageSize != 0){ totalPages++; } return totalPages; } /** * ��õ�設置當前頁����ʼ��的開始條數 * @param pageNo ��ǰ頁數�� * @return */ public int getStart(int pageNo){ if(pageNo < 1){ pageNo = 1; } else if(getTotalPages()>0&&pageNo > getTotalPages()){ pageNo = getTotalPages(); } start = (pageNo-1) * pageSize; return start; } //get and set public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public void setStart(int start) { this.start = start; } public List<T> getPageList() { return pageList; } public void setPageList(List<T> pageList) { this.pageList = pageList; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public int getPageNo() { return pageNo; } public void setPageNo(int pageNo) { this.pageNo = pageNo; } }
三:這時候就要做dao,service層的邏輯了,不過也挺簡單的,概括來說,將調用dao查詢出來的數據,在 service層將其存儲到Pages<T>類中的pageList集合里面,並且還要把pageNo當前 頁 setPageNo(pageNo)中,為嘛要這樣呢,一將數據交給page類來分頁處理,二在顯示頁面有首頁,上一頁,下一頁,尾頁吧,這就是原因啦, 要用來獲取參數pageNo用的,別的也 不多說,先上代碼看看:
/** * 查詢未借閱的圖書 */ public Page<Book> findBook(int pageNo){ Page<Book> pages = new Page<Book>(findBookCount()); pages.setPageNo(pageNo); pages.setPageList(bookDao.findBook(pages.getStart(pageNo), pages.getPageSize())); return pages; } /** * 查詢圖書總數 */ public Integer findBookCount(){ return bookDao.findBookCount(); }
四:顯示頁:該頁面只是簡單地寫了一下,其中bug還是挺多的,但具體怎么修改還需要結合項目來操作
<form action="<%=basePath%>book/findBook" method="post"> <a href="<%=basePath%>book/findBook?pageNo=1">【首頁】</a> <a href="<%=basePath%>book/findBook?pageNo=${booklist.pageNo-1}">【上一頁】</a> <c:forEach begin="1" var="i" end="${booklist.totalPages}"> <a href="<%=basePath%>book/findBook?pageNo=${i }">${i }</a> </c:forEach> <a href="<%=basePath%>book/findBook?pageNo=${booklist.pageNo+1}">【下一頁】</a> <a href="<%=basePath%>book/findBook?pageNo=${booklist.totalPages }">【尾頁】</a> <input type="text" size="1" name="pageNo" value="${booklist.pageNo}"/> <input type="submit" value="GO" size="1"/> 當前第${booklist.pageNo}頁/共${booklist.totalPages}頁 </form>
以上是我自己做的一個練習,還是有很多不足之處,其實分頁方法有 很多種,我做的這種是物理分頁,還有一種分頁叫邏輯分頁,這種分頁方式依靠的是對結果集的算法來分頁,因此通常被稱為“邏輯分頁”,該分頁其實是將數據庫的壓力交給了應用端,其實這兩種分頁查詢效率差別不大,但是我推薦使用物理分頁,不能因為提高一些速度而將數據庫的壓力交給了應用端而使用邏輯分頁,因為物理分頁在其他的性能上足以彌補了少許的劣勢。