對於一些列表展示的數據,由於數據量可能比較大,我們習慣上會採用分頁的方式進行,這時候MyBatis提供的分頁插件pagehelper就可以實現這個功能。
在springboot項目中使用pagehelper還是比較簡單的,在沒有做分頁之前,我們service層調用dao層,得到展示的列表數據後,直接通過controller層返回給前端頁面。這裏要實現分頁,需要改動controller層和service層的操作,只需要兩個非常重要的類PageHelper、PageInfo。
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
第一步:首先要引入pagehelper依賴
<!--分頁插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
進行一下配置(有說沒有用的,不需要配置的)
#分頁插件配置
pagehelper:
reasonable: true
helper-dialect: mysql
support-methods-arguments: true
params: count=countSql
第二步:然後在controller層
在我們的接口下,要傳遞兩個基本參數,pageNo(第幾頁)和pageSize(一個存儲多少條數據)。具體代碼如下所示
@GetMapping(value = "/product_list")
public String product_list(Model model,
@RequestParam(value = "pageNo",defaultValue = "1")int pageNo,
@RequestParam(value = "pageSize",defaultValue = "6")int pageSize){
PageInfo<ProductVo> page = productService.listProcuctVo(pageNo,pageSize);
model.addAttribute("pageInfo",page);
return "product_list";
}
這裏可以看出,service層返回來一個PageInfo<實體類>的對象。這裏面封裝了分頁的有些信息和返回的列表數據。
第三步:編寫service層
這是最重要的一步,service層接受dao層傳來的列表數據和controller層傳來的pageNo頁數和pageSize每頁數量兩個參數。具體的代碼參考如下。
public PageInfo<ProductVo> listProcuctVo(int pageNo, int pageSize) {
PageHelper.startPage(pageNo,pageSize);
List<ProductVo> productVoList = productMapper.selectPorductlist();
PageInfo<ProductVo> page = new PageInfo<ProductVo>(productVoList);
return page;
}
這裏兩個重要的地方
PageHelper.startPage(pageNo,pageSize);
設置頁面頁數和頁面大小
然後是在接收到dao層傳來的列表數據後,調用 PageInfo,進行分頁操作數據的轉換。
PageInfo<ProductVo> page = new PageInfo<ProductVo>(productVoList);
這裏的需要特別注意調用參數的編寫。
具體的PageInfo封裝的數據如下:
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int pageNum;//當前頁
private int pageSize;//當前頁數據量
private int size;
private int startRow;
private int endRow;
private long total;//總數據量
private int pages;//總頁數
private List<T> list;//封裝需要返回的數據列表
private int prePage;//上一頁
private int nextPage;//下一頁
private boolean isFirstPage;
private boolean isLastPage;
private boolean hasPreviousPage;//首頁
private boolean hasNextPage;//尾頁
private int navigatePages;
private int[] navigatepageNums;//頁數數組
private int navigateFirstPage;
private int navigateLastPage;
}
這裏的page裏其實就封裝了分頁中的所有參數,上面代碼中出現的那些變量。
第四步:頁面展示
當我們在controller層將pageInfo對象再model中使用pagInfoe名稱進行返回時。
model.addAttribute("pageInfo",page);
我們需要的當前頁面的參數列表就在pageInfo.list中,要用其他的參數直接pageInfo.xx代用即可。
部分展示
這是獲取數據列表的數據
<tr class="success" th:each="product : ${pageInfo.list}">
<td th:text="${product.product_name}"></td>
<td><img th:src="@{${product.product_img}}" width="60px" height="60px"/></td>
<td th:text="${product.product_price}"></td>
<td th:text="${product.miaosha_price}"></td>
<td th:text="${product.stock_count}"></td>
<td> <a th:href="'/product_detail/'+${product.id}">詳情</a></td>
</tr>
這是獲取頁面的相關數據
<ul class="pager">
<li th:if="${pageInfo.hasPreviousPage}">
<a th:href="'?pageNo=1'">首頁</a>
</li>
<li th:if="${pageInfo.hasPreviousPage}">
<a th:href="'?pageNo='+${pageInfo.prePage}">上一頁</a>
</li>
<li th:each="nav : ${pageInfo.navigatepageNums}">
<a th:href="'?pageNo='+${nav}" th:text="${nav}" th:if="${nav != pageInfo.pageNum}"></a>
<span style="font-weight: bold" th:if="${nav == pageInfo.pageNum}" th:text="${nav}"></span>
</li>
<li th:if="${pageInfo.hasNextPage}">
<a th:href="'?pageNo='+${pageInfo.nextPage}">下一頁</a>
</li>
<li th:if="${pageInfo.hasNextPage}">
<a th:href="'?pageNo='+${pageInfo.pages}">尾頁</a>
</li>
<span>
當前頁號:<span th:text="${pageInfo.pageNum}"> </span> / <span th:text="${pageInfo.pages}"></span>: 總頁數</span>
總結果數:<span th:text="${pageInfo.total}"></span>
</ul>
效果展示