很多刚用 MyBatis-Plus 的人会以为传入 Page 就自动分页,其实还差一步:注册分页拦截器。
一、配置拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
没有这个 Bean,分页对象不会触发 SQL 改写,查询仍然可能把全表数据查出来。
二、Service 调用
Page<User> page = userService.page(new Page<>(current, size));
分页插件会在执行时补充 LIMIT,并执行 count 查询。
三、把 Entity 分页转换成 DTO 分页
不能只转换 records,还要保留分页元信息:
Page<UserDTO> result = new Page<>(
page.getCurrent(),
page.getSize(),
page.getTotal()
);
result.setRecords(userConverter.entityListToDtoList(page.getRecords()));
这样返回结构里既有当前页数据,也有总数、页码和每页数量。
四、参数必须校验
分页参数不是随便传:
current >= 1
size 1 到 100
current=0 会导致奇怪偏移,size=100000 会把分页变成拖库。
五、踩坑点
- 忘记分页插件:接口看起来能跑,但数据量一大性能崩。
- 只返回 records:前端无法计算总页数。
- 不限制 size:调用方可以一次请求海量数据。
- 明确数据库类型:不同数据库的分页方言不同。