前言
分頁基本上是我們項目中所必須的功能,當數據量過大時,可能會導致各種各樣的問題發生,例如:服務器資源被耗盡,因數據傳輸量過大而使處理超時,等等。最終都會導致查詢無法完成。解決這個問題的一個策略就是“分頁查詢”,也就是說不要一次性查詢所有的數據,每次只查詢一“頁“的數據。這樣分批次地進行處理,可以呈現出很好的用戶體驗,對服務器資源的消耗也不大。本文主要是使用limit來實現分頁的查詢。
實現
1、分頁工具類
package com.inchlifc.util;
import java.util.List;
/**
* @author 小小漁夫
* @description 分頁實體類
*/
public class PageBean<T> {
private int currPage;//當前頁數
private int pageSize;//每頁顯示的記錄數
private int totalCount;//總記錄數
private int totalPage;//總頁數
private List<T> lists;//每頁的顯示的數據
public PageBean() {
super();
}
public int getCurrPage() {
return currPage;
}
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
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 int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getLists() {
return lists;
}
public void setLists(List<T> lists) {
this.lists = lists;
}
}
2、mapper層
<select id="selectInStockList" resultType="com.inchlifc.entity.InStock">
SELECT * FROM in_stock ORDER BY createTime desc
<if test="pageStart!=null and pageSize!=null">
limit #{pageStart},#{pageSize}
</if>
</select>
3、Dao層
/**
* 分頁查詢所有信息
*
* @param pageStart 頁數
* @param pageSize 每頁顯示條數
* @return
*/
List<InStock> selectInStockList(@Param("pageStart") int pageStart, @Param("pageSize") int pageSize);
4、service層
/**
* 分頁查詢所有信息
*
* @return
*/
public PageBean<InStock> findAllInStock(int pageStart) {
PageBean<InStock> pageBean = new PageBean<InStock>();
pageBean.setCurrPage(pageStart);
pageBean.setPageSize(10);
//封裝總記錄數
int totalCount = inStockDao.inStockCountAll();
pageBean.setTotalCount(totalCount);
//封裝總頁數
double tc = totalCount;
Double num = Math.ceil(tc / 10);//向上取整
pageBean.setTotalPage(num.intValue());
//封裝每頁顯示的數據
List<InStock> lists = inStockDao.selectInStockList((pageStart - 1) * 10, 10);
pageBean.setLists(lists);
return pageBean;
}
5、controller層
/**
* 分頁查詢所有信息
* @param currentPage 當前頁數
* @param model model
* @param session 會話
* @return
*/
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
private ModelAndView getInStockList(@RequestParam(value = "currentPage", defaultValue = "1", required = false) int currentPage, Model model, HttpSession session) {
ModelAndView mv = new ModelAndView();
//獲取當前登錄用戶名
String currentUserName = (String) session.getAttribute("userName");
if (!currentUserName.equals("engine")) {
mv.setViewName("permission");
return mv;
}
mv.addObject("stockList", inStockService.findAllInStock(currentPage));
mv.setViewName("inStockList");
return mv;
}
6、顯示頁面
<ul style="font-size: large;text-align: center">
<span>第${requestScope.stockList.currPage }/ ${requestScope.stockList.totalPage}頁</span>
<span>總記錄數:${requestScope.stockList.totalCount } 每頁顯示:${requestScope.stockList.pageSize}</span>
<span>
<c:if test="${requestScope.stockList.currPage != 1}">
<a href="<%=basePath%>inStock/list?currentPage=1">[首頁]</a>
<a href="<%=basePath%>inStock/list?currentPage=${requestScope.stockList.currPage-1}">[上一頁]</a>
</c:if>
<c:if test="${requestScope.stockList.currPage != requestScope.stockList.totalPage}">
<a href="<%=basePath%>inStock/list?currentPage=${requestScope.stockList.currPage+1}">[下一頁]</a>
<a href="<%=basePath%>inStock/list?currentPage=${requestScope.stockList.totalPage}">[尾頁]</a>
</c:if>
</span>
</ul>