本文只针对 Mybatis Plus 的分页处理进行阐述,其他的基本操作可以参考 Mybatis Plus官方文档。
在使用 Mybatis Plus 做分页时,需要在 Spring Boot 中专门配置一个类。
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件: 一缓和二缓遵循Mybatis规则
* https://baomidou.com/pages/2976a3/#spring
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
Mybatis Plus 提供了一个 IPage 分页接口,通过查询返回 IPage 后,可以调用其下的方法,获取例如分页条数、所有记录、所有页数等数据。
为了规范分页的数据返回,可以通过定义 PageVO 来完成,该 View Object 和之前提到的 SuccessVO 基本类似。
在其构造函数中传入 IPage 用以将返回的 data 结构丰富化。
@Getter
@Setter
public class PageVO<T> {
private Integer code;
private String msg;
private PageData<T> data;
public PageVO(IPage<T> iPage) {
ResultCode resultCode = ResultCode.SUCCESS;
this.code = resultCode.getCode();
this.msg = resultCode.getMsg();
this.data = new PageData<>(iPage);
ResponseUtil.setResponseHttpStatus(resultCode.getStatusCode());
}
@Getter
@Setter
public static class PageData<T> {
private List<T> items;
private Long currentPage;
private Long nextPage;
private Long prevPage;
private Long totalCount;
private Long totalPage;
public PageData(IPage<T> iPage) {
long totalPage = iPage.getPages();
long currentPage = iPage.getCurrent();
this.items = iPage.getRecords();
this.totalCount = iPage.getTotal();
this.totalPage = totalPage;
this.currentPage = currentPage;
this.nextPage = currentPage <= totalPage - 1 ? currentPage + 1 : null;
this.prevPage = currentPage > 1 ? currentPage - 1 : null;
}
}
}
在使用 PageVO 时变得十分方便,只需要直接传入当前查询返回的 IPage 即可。
@GetMapping("")
public PageVO<User> getUsers(@Validated PageDTO pageDTO) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().orderByDesc(User::getCreateTime);
Page<User> page = new Page<>(pageDTO.getPage(), pageDTO.getSize());
IPage<User> iPage = this.userService.getBaseMapper().selectPage(page, queryWrapper);
return new PageVO<>(iPage);
}