springboot环境下使用pageHelper插件进行分页

背景

这两天一直在重构自己的blog系统,更换持久层框架(之前使用Spring Data JPA,别问为什么换,问就是觉得不会用),更换成为Mybatis,但是在系统中有用的分页的业务,所以查询了pageHelper进行分页处理。

分析

不得不说,Spring Data JPA确实是Spring的亲儿子,在分页方面也是巨方便。这是之前的代码:

@GetMapping("/types")
public String types(@PageableDefault(size=10,sort = {"id"},direction = Sort.Direction.DESC) Pageable pageable, Model model){
    model.addAttribute("page",typeService.listType(pageable));
    return "admin/types";

}

这块显示的是,分页大小为10,排序根据id排序,排序方式为降序,Service不介绍了。直接ServiceImpl

@Override
public Page<Type> listType(Pageable pageable) {
    return typeRepository.findAll(pageable);
}

直接使用findAll接口,将pageable传进去就行了,Spring Data JPA直接给你封装好了。

前端显示:

<table class="ui celled table">
    <thead>
    <tr>
        <th></th>
        <th>名称</th>
        <th>操作</th>

    </tr>
    </thead>
    <tbody>
    <tr th:each="type,iterStat : ${page.content}">
        <td th:text="${iterStat.count}">1</td>
        <td th:text="${type.name}">可以练习清单</td>
        <td>
            <a href="#" th:href="@{/admin/types/{id}/input(id=${type.id})}" class="ui mini teal basic button">编辑</a>
            <a href="#" th:href="@{/admin/types/{id}/delete(id=${type.id})}" class="ui mini red basic button">删除</a>
        </td>
    </tr>
    </tbody>
    <tfoot>
    <tr>
        <th colspan="6">
            <div class="ui mini pagination menu" th:if="${page.totalPages>1}">
                <a th:href="@{/admin/types(page=${page.number}-1)}" class="item" th:unless="${page.first}">上一页</a>
                <a th:href="@{/admin/types(page=${page.number}+1)}" class="item" th:unless="${page.last}">下一页</a>
            </div>
            <a href="#" th:href="@{/admin/types/input}" class="ui mini right floated teal basic button">新增</a>
        </th>
    </tr>
    </tfoot>
</table>

以上是使用Spring Data JPA中的分页,换成Mybatis的时候,多了一步处理的过程。

controller层

/**
 * 分页并且返回所有数据
 * @param model
 * @return
 */
@GetMapping("/tags")
public String tags(@RequestParam(value = "page",required = false)Integer page, Model model){
    if (page==null){
        page=1;
    }
    PageHelper.startPage(page,10); //设置起始页,和分页的大小
    List<Tag> tags = tagService.listTag();//获取数据源
    PageInfo pageInfo = new PageInfo(tags); // 将数据源设置到pageInfo中,也可以使用pageInfo.setList方法设置
    model.addAttribute("page",pageInfo);
    return "admin/tags";
}

这里使用的是PageHelper的PageHelper和pageInfo这两个类结合起来使用的,具体还有别的使用方式,在文末将po出。

在这里,使用debug模式,来看下model里面到底存的是什么:

pageNum:当前页码数,比如:http://localhost:8080/admin/tags?page=3,在这里page传进来就是pageNum,就是想查询第几页的数据。

pageSize:自己设置的,每页多少条数据。

size:当前页的个数。应该等于list里面的个数

startRow:当前第一行在数据库中排的行号。比如我数据库一共有13条数据,分页大小为十条,那么第二页的话,应该从标号为11开始的。

endRow:最后一条数据在数据库中的行号。

pages:分了多少页,13条,也就是两页。

prePage:前一页

nextPage:后一页 没有的话,默认设置为0

isFirstPage:是否是第一页

isLastPage:是否是最后一页

hasPreviousPage :是否有前一页

hasNextPage :是否有下一页

navigatePages:导航页码数,不知道这个怎么得来的。

navigatepageNums:导航页数组

navigateFirstPage:导航页第一页

navigateLastPage:导航页最后一页

total:查找出来的总条数。

list:当前页的记录条数。

另外,还有一个需要设置的,比如你要是输入的页码超了,也就是,一共两页,你偏偏要查第三页,如果报错了,可以这样设置,在properties文件中或者yml文件中加上这段话:

# pageHelper
pagehelper:
  helperDialect: mysql
  reasonable: true 
  supportMethodsArguments: true
  params: count=countSql

通过controller已经获取了集合了,想前端传送数据:

<table class="ui celled table">
    <thead>
    <tr>
        <th></th>
        <th>名称</th>
        <th>操作</th>

    </tr>
    </thead>
    <tbody>
    <tr th:each="tag,iterStat : ${page.list}">
        <td th:text="${iterStat.count}">1</td>
        <td th:text="${tag.name}">可以练习清单</td>
        <td>
            <a href="#" th:href="@{/admin/tags/{id}/input(id=${tag.id})}"  class="ui mini teal basic button">编辑</a>
            <a href="#" th:href="@{/admin/tags/{id}/delete(id=${tag.id})}" class="ui mini red basic button">删除</a>
        </td>
    </tr>
    </tbody>
    <tfoot>
    <tr>
        <th colspan="6">
            <div class="ui mini pagination menu" th:if="${page.pages>1}">
                <a th:href="@{/admin/tags(page=${page.pageNum}-1)}" class="item" th:unless="${page.isFirstPage}">上一页</a>
                <a th:href="@{/admin/tags(page=${page.pageNum}+1)}" class="item" th:unless="${page.isLastPage}">下一页</a>
            </div>
            <a href="#" th:href="@{/admin/tags/input}"  class="ui mini right floated teal basic button">新增</a>
        </th>
    </tr>
    </tfoot>
</table>

大概就是这样的。

参考文档和更多用法

 posted on 2020-07-24 12:02  ben跑的换行符  阅读(465)  评论(0编辑  收藏  举报