SpringBoot - MyBatis-Plus使用详解6(Mapper的CRUD接口3:分页查询)
六、Mapper 的 CRUD 接口3:分页查询
1,添加配置
(1)MyBatis-Plus 提供了物理分页的功能,使用前我们需要要进行相关的插件配置:
逻辑分页与物理分页比较:
- 逻辑分页:内存开销比较大,在数据量比较小的情况下效率比物理分页高;在数据量很大的情况下,内存开销过大,容易内存溢出,不建议使用。
- 物理分页:内存开销比较小,在数据量比较小的情况下效率比逻辑分页还是低;在数据量很大的情况下,建议使用物理分页。
@EnableTransactionManagement @Configuration public class MybatisPlusConfig { /** * mybatis-plus分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false // paginationInterceptor.setOverflow(false); // 设置最大单页限制数量,默认 500 条,-1 不受限制 // paginationInterceptor.setLimit(500); // 开启 count 的 join 优化,只针对部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } }
2,selectPage 方法
(1)BaseMapper 提供的 selectPage 方法实现分页查询,比如下面我们查询第一页的数据(每页两条记录):
@RestController public class HelloController { @Autowired UserInfoMapper userInfoMapper; @RequestMapping("/test") public IPage<UserInfo> test(){ LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(UserInfo::getPassWord,"123").lt(UserInfo::getAge,40); // 开始查询 IPage<UserInfo> page = userInfoMapper.selectPage(new Page<>(1,2), queryWrapper); return page; } }
(2)返回结果如下:

(3)从日志信息可以发现,分页插件会识别是何数据库,然后自动拼接相应分页语句(若是 mysql 则自动通过 limit 分页,若是 oracle 则自动通过 rownum 进行分页)

3,selectMapsPage 方法
(1)selectMapsPage 的用法和上面的 selectPage 很像,都是传入分页查询条件、以及查询构造器进行查询,然后返回一个 List。不同在于 selectMapsPage 返回的结果里面是 Map:
注意: Map 里的 key 为表字段名,而不是对应实体类的属性名。
@RestController public class HelloController { @Autowired UserInfoMapper userInfoMapper; @RequestMapping("/test") public IPage<Map<String, Object>> test(){ LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(UserInfo::getPassWord,"123").lt(UserInfo::getAge,40); // 开始查询 IPage<Map<String, Object>> page = userInfoMapper.selectMapsPage(new Page<>(1,2), queryWrapper); return page; } }
(2)查询结果如下:

附:自定义 SQL 语句的分页查询
(1)MyBatis-Plus 也支持对自定义的查询语句进行分页,假设我们在 mapper.xml 定义了一个 sql 语句:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserInfoMapper"> <select id="selectPage2" resultType="com.example.demo.model.UserInfo"> SELECT * FROM user_info WHERE age > #{age} </select> </mapper>
(2)对应的 mapper 只需要传递参数 Page 即自动会实现分页:
注意:递参数 Page 即自动分页,必须放在第一位(我们也可以继承 Page 实现自己的分页对象)
public interface UserInfoMapper extends BaseMapper<UserInfo> { IPage<UserInfo> selectPage2(Page<?> page, Integer age); }
(3)我们调用一下这个自定义方法进行测试:
@RestController public class HelloController { @Autowired UserInfoMapper userInfoMapper; @RequestMapping("/test") public IPage<UserInfo> test(){ IPage<UserInfo> page = userInfoMapper.selectPage2(new Page<>(1,2), 10); return page; } }
(4)可以看到最终执行的 SQL 会自动拼接相应的分页语句:
