SpringBoot項目使用MyBatis的分頁插件pagehelper

對於一些列表展示的數據,由於數據量可能比較大,我們習慣上會採用分頁的方式進行,這時候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>&nbsp;&nbsp;&nbsp;&nbsp;
        總結果數:<span th:text="${pageInfo.total}"></span>
    </ul>

效果展示
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章