本文只针对 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); }