条件分页查询
描述
条件分页查询,常见有四种方式:手动分页,pageHelper插件的startPage()和MybatisPlus框架下的IPage。但无论使用哪种方式,条件分页查询都需要查询两次,并且要对查询结果进行排序
MybatisPlus框架分页
详细解释见:MyBatis-Plus 分页查询以及自定义sql分页-腾讯云开发者社区-腾讯云
MP的Wrapper提供了两种分页查询的方式,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
|
两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准,在这里暂时只使用第一个方法。
对于单表分页,直接使用实体类的QueryWrapper调用selectPage()即可,对于多表分页,要在Mapper.xml文件中写入要联表查询的方法后直接在分页参数后调用该方法,具体代码如下。
单表分页
Mapper文件
1 2
| @Select("select * from paper") List<Paper> selectAll();
|
ServiceImpl文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public List<Paper> manualPage(int pageNum, int pageSize) { List<Paper> allList = paperMapper.selectAll(); int fromIndex = (pageNum - 1) * pageSize; int toIndex = Math.min(fromIndex + pageSize, allList.size()); if (fromIndex >= allList.size()) { return List.of(); } return allList.subList(fromIndex, toIndex); }
public PageInfo<Paper> pageHelperPage(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<Paper> list = paperMapper.selectAll(); return new PageInfo<>(list); }
public IPage<Paper> mybatisPlusPage(int pageNum, int pageSize) { Page<Paper> page = new Page<>(pageNum, pageSize); return paperMapper.selectPage(page, null); }
|
测试文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| @Test public void testManualPage() { int pageNum = 1; int pageSize = 3; List<Paper> list = paperService.manualPage(pageNum, pageSize); System.out.println("【手动分页】第 " + pageNum + " 页, 每页 " + pageSize + " 条"); list.forEach(System.out::println); }
@Test public void testPageHelperPage() { int pageNum = 1; int pageSize = 3; PageInfo<Paper> pageInfo = paperService.pageHelperPage(pageNum, pageSize); System.out.println("【PageHelper 分页】"); System.out.println("总记录数:" + pageInfo.getTotal()); System.out.println("总页数:" + pageInfo.getPages()); System.out.println("当前页:" + pageInfo.getPageNum()); System.out.println("当前页数据:"); pageInfo.getList().forEach(System.out::println); }
@Test public void testMybatisPlusPage() { int pageNum = 1; int pageSize = 3; IPage<Paper> page = paperService.mybatisPlusPage(pageNum, pageSize); System.out.println("【MyBatis-Plus 分页】"); System.out.println("总记录数:" + page.getTotal()); System.out.println("总页数:" + page.getPages()); System.out.println("当前页:" + page.getCurrent()); System.out.println("当前页数据:"); page.getRecords().forEach(System.out::println); }
|
多表分页
实例参见MyBatis-Plus 分页查询以及自定义sql分页-腾讯云开发者社区-腾讯云,在给的示例中除了分页 Page 是没有额外传参的,实际上,可以额外传参。