SpringBoot下MyBatis使用PageHelper分页插件进行offset方式(start和limit)的分页

2022-06-09 1542点热度 0人点赞 0条评论

MyBatis原生状态下将数据分页或者使用offset/limit方式对数据做限制行数,如果没有limit写在SQL的时候,想要分页,使用的是RowBounds

这种方式,没有使用使用PageHelper插件的时候,是使用的逻辑分页,数据量大的时候,直接把大量数据从数据库取回来再分页,造成OOM,千万要谨慎使用,例子如下:

# 注意这种方式非常不推荐使用,只是反例
List<Student> list = studentMapper.listStudents(new RowBounds(0, 10));

以上显然是不行的,推荐使用的是Mybatis-PageHelper来对数据进行自动的分页,原理是使用拦截器,对SQL进行拦截,自动加上limit(还可以自动对数据进行count来统计总的数量,应该说相当的方便了)

引入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>

使用示例

  • 方式1(PageHelper.offsetPage() 或 PageHelper.startPage()):
PageHelper.offsetPage(0, 10, true); //接下来紧跟mapper查询操作,不要放入其他业务逻辑代码
List<Student> students = studentMapper.selectList(new QueryWrapper<Student>().orderByAsc("id"));

直接使用PageHelper.offsetPage()或者PageHelper.startPage() 然后下一行紧跟这mapper的操作(注意不要在两行中间放入其他业务代码)

另外注意,offset的起始条数是从0开始,startPage的页码参数是从1开始的
  • 方式2(使用PageHelper.offsetPage() 的lamda方法):
Page<Student> studentPage = PageHelper.offsetPage(0, 10, true).doSelectPage(() -> studentMapper.selectList(new QueryWrapper<Student>().orderByAsc("id").orderByAsc()));
// 可以得到数据总行数count
System.out.println("total: " + studentPage.getTotal());

PageHelper.offsetPage(0, 10, true).doSelectPage得到Page<Object>对象,可以使用getResult()和getTotal() 分别获得数据和总行数等

PageHelper.offsetPage(0, 10, true).doSelectPageInfo得到PageInfo<Object>对象,有关分页更加全面的信息(例如页码等等)

更多使用方式请参考:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论