mybatis第六话 - mybatis插件篇之pagehelper的使用

1,790 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本文主要讲述了mybatis插件篇之pagehelper的使用

1.故事前因

新入职一家公司接手过来的代码,用的还是ibatis,看了一下sql mapper文件,里面看到了很多count查询,基本上一条list,一条count。特别是涉及到统计,在改动过程中经常会出现很多问题,于是决定更换技术栈,改用mybatis,所有的count查询都用分页框架。

2.分页插件pagehelper

用过就知道,最便捷最简单的物理分页插件了。

2.1 Java中使用pagehelper

基于springboot 2.5.6,mybatis 2.2.0版本,贴一下pom依赖

<!--Mysql连接-->
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
</dependency>
<!--mybatis-->
<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>2.2.0</version>
</dependency>
<!--分页-->
<dependency>
 <groupId>com.github.pagehelper</groupId>
 <artifactId>pagehelper-spring-boot-starter</artifactId>
 <version>1.4.0</version>
</dependency>

sql语句

select * from user_info

Java查询代码

@GetMapping("/data/select")
public Object select() {
    PageHelper.startPage(1,1);
    Map<String, Object> map = new HashMap<>();
    //查询
    List<Map<String, Object>> mapList = testMapper.select(map);
    PageHelper.clearPage();
    return mapList;
}

查看日志打印

==>  Preparing: SELECT count(0) FROM user_info
<==    Columns: count(0)
<==        Row: 4
<==      Total: 4
==>  Preparing: select * from user_info LIMIT ?
==> Parameters: 1(Integer)

上述日志可以看到,先会执行一条count的sql,然后才会执行真正手写的sql,并且还带了limit查询。

2.2 取值

从上面看到手写的一条sql,但是在加了PageHelper.startPage(1,1);就能够多执行一条count查询,并且真正的查询能达到物理分页的效果。 既然执行了一条count查询,那么怎么取出总数量呢。直接看代码

@GetMapping("/data/select")
public Object select() {
    PageHelper.startPage(1, 1);
    Map<String, Object> map = new HashMap<>();
    //需要用PageInfo封装一层
    PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(testMapper.select(map));
    PageHelper.clearPage();
    System.out.println("总条数:" + pageInfo.getTotal());
    //data list
    return pageInfo.getList();
}

输出结果 总条数:4

2.3 PageHelper.startPage(1, 1);

由于之前踩过很多次这个页码的坑,在这里记录一下。 总所周知,很多管理后台的页面其实是从0开始的,但是一旦直接传入PageHelper.startPage(0, 1);不会报错,从意思上来看是第0页的第一条,但是压根查询不到数据。这是为什么呢?

可以跟着startPage这行代码查看源码一直往下到Page的构造方法

private Page(int pageNum, int pageSize, boolean count, Boolean reasonable) {
    super(0);
    //如果开头是1 并且pageSize是最大值,则设置为查询0条,避免把数据库查死
    if (pageNum == 1 && pageSize == Integer.MAX_VALUE) {
        pageSizeZero = true;
        pageSize = 0;
    }
    this.pageNum = pageNum;
    this.pageSize = pageSize;
    this.count = count;
    //计算分页 ###
    calculateStartAndEndRow();
    setReasonable(reasonable);
}

/**
     * 计算起止行号
     */
private void calculateStartAndEndRow() {
     //例如 1,10 -> (1-1)*10 =0
     this.startRow = this.pageNum > 0 ? (this.pageNum - 1) * this.pageSize : 0;
     //例如 1,10 -> 0+ 10 * 1=10 
     //但是如果是0 0+10*0= 0  最终执行的sql就是limit 0,0
     this.endRow = this.startRow + this.pageSize * (this.pageNum > 0 ? 1 : 0);
 }

这块谨记,PageHelper分页插件的页码是从1开始的!!!

以上就是本章的全部内容了。

上一篇:mybatis第五话 - mybatis情同手足的插件之TypeHandler和Interceptor 下一篇:mybatis第七话 - mybatis插件篇之pagehelper的源码分析

老冉冉其将至兮,恐修名之不立