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的操作(注意不要在两行中间放入其他业务代码)
- 方式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
文章评论