在所有增删改查操作里,查找是最常用到的数据库操作,而其中列表查询查得最多,对于列表查询就绕不开数据分页,使用 MyBatis-Plus 为我们封装好的分页插件即可快速实现这个功能。
在 01 篇中我们已经配置了 MyBatisPlusConfig 类,只需往其中加入分页拦截器即可:
@Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } 复制代码
对于分页类型的接口,我们的返回格式如下:
{ "code": 200, "msg": "ok", "data": { "list": [], "page": 1, "limit": 5, "total": 10, "pages": 2, "has_more": true } } 复制代码
所以需要定制一个分页返回的类:
package com.foxescap.wxbox.common; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.Data; import java.util.List; /** * @author xfly * @param <T> */ @Data public class ApiResponsePage<T> { private List<T> list; private Long page; private Long limit; private Long total; private Long pages; private Boolean hasMore; /** * IPage 转换成本对象 * @param iPage 分页实例 * @return 返回 */ public ApiResponsePage<T> convert(IPage<T> iPage) { this.list = iPage.getRecords(); this.page = iPage.getCurrent(); this.limit = iPage.getSize(); if (iPage.isSearchCount()) { this.total = iPage.getTotal(); this.pages = iPage.getPages(); this.hasMore = this.pages > this.page; } else { this.hasMore = this.list.size() >= this.limit; } return this; } } 复制代码
然后我们的 Service 层增加一个列表查询方法:
public ApiResponsePage<UserDto> list(String username, Integer page, Integer limit) { var query = lambdaQuery(); if (username.length() > 0) { query = query.likeRight(User::getUsername, username); } var iPage = query.orderByDesc(User::getId) .page(new Page<User>(page, limit).setSearchCount(false)) .convert(e -> modelMapper.map(e, UserDto.class)); return new ApiResponsePage<UserDto>().convert(iPage); } 复制代码