Java MyBatis3(3)分页插件PageHelper

引言

  对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select。

  PageHelper分页实现原理说明

//设置分页信息保存到threadlocal中
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页,contryMapper会被PageInterceptor截拦,截拦器会从threadlocal中取出分页信息,把分页信息加到sql语句中,实现了分页查旬
List<Country> list = countryMapper.selectIf(1);
PageHelper.startPage(currentPage, pageSize);

  其实一开始看到这段代码时候,我觉得应该是内存分页。其实插件对mybatis执行流程进行了增强,添加了limit以及count查询,属于物理分页。

  count查询,其实是PageHelper帮助我们生成的一个MappedStatement内存对象,它可以免去我们在XXXMapper.xml内单独声明一个sqlcount查询,我们只需要写一个sql分页业务查询即可。

PageHelper部分源码

 解析sql,并增加分页参数占位符,或者生成count查询的sql,都依靠Parser来完成。

public class MysqlParser extends AbstractParser {
    @Override
    public String getPageSql(String sql) {
        StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
        sqlBuilder.append(sql);
        sqlBuilder.append(" limit ?,? ");
        return sqlBuilder.toString();
    }

    @Override
    public Map<String, Object> setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page<?> page) {
        Map<String, Object> paramMap = super.setPageParameter(ms, parameterObject, boundSql, page);
        paramMap.put(PAGEPARAMETER_FIRST, page.getStartRow());
        paramMap.put(PAGEPARAMETER_SECOND, page.getPageSize());
        return paramMap;
    }
}
public abstract class AbstractParser implements Parser, Constant {
    public String getCountSql(final String sql) {
        return sqlParser.getSmartCountSql(sql);
    }
}

PageHelper实战代码

<!--pageHelper分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
分页查询
/**
     * 分页查询
     * @return
     */
    @RequestMapping("/GetStudentListByPage")
    public List<Student> GetStudentListByPage(@RequestParam(required = false, defaultValue = "1") int pageIndex,
                                              @RequestParam(required = false, defaultValue = "10") int pageSize){
        Page page = PageHelper.startPage(pageIndex, pageSize);
        List<Student> students = studentMapper.list();
        for(Student student : students) {
            System.out.println(student.getName());
        }
        System.out.println("当前页码:"+page.getPageNum());
        System.out.println("当前页数:"+page.getPageSize());
        System.out.println("总页数:"+page.getPages());
        System.out.println("总条数:"+page.getTotal());
        System.out.println(page.toString());
        return students;
    }

测试

http://localhost:8080/GetStudentListByPage?pageIndex=1&pageSize=2

参考资料 

https://my.oschina.net/zudajun/blog/745232
Mybatis分页插件PageHelper简单使用

https://www.cnblogs.com/lxl57610/p/7766146.html

https://www.jianshu.com/nb/5226994

原文地址:https://www.cnblogs.com/cnki/p/8849929.html