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>

效果展示
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Wangdiankun/article/details/106460420