在所有增删改查操作里,查找是最常用到的数据库操作,而其中列表查询查得最多,对于列表查询就绕不开数据分页,使用 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);
}
复制代码