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