一、配置
如果想要使用MyBatisPlus的分页插件,就需要对插件进行配置。
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MyBatis插件设置
*/
@Configuration
public class MyBatisConfig {
/**
* MyBatisPlus 分页插件设置
*
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 1. 初始化核心插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 2. 创建分页插件
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
// 2.1 设置单页分页条数限制
paginationInnerInterceptor.setMaxLimit(1000L);
// 3. 增加分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
二、基础应用
@Test
public void queryPageTest() {
int pageNum = 1, pageSize = 5;
// 1. 查询条件
Page<Common> page = Page.of(pageNum, pageSize);
// 2. 排序条件:可以增加多个,第一个参数:排序字段,第二个参数:true 正序 false 倒叙
page.addOrder(new OrderItem("create_time", false));
page.addOrder(new OrderItem("id", false));
// 3. 分页查询
page = commonService.page(page);
// 4. 解析
long total = page.getTotal(); // 总条数
log.info("总条数:{}", total);
long pages = page.getPages(); // 总分页数
log.info("总分页数:{}", pages);
List<Common> commons = page.getRecords(); // 分页数据
commons.forEach(common -> {
log.info("分页数据:{}", common);
});
}
三、进阶应用
根据复杂条件进行分页查询
Controller
/**
* 根据复杂条件分页查询
*
* @param commonQuery
* @return
*/
@GetMapping("/page")
@ApiOperation("根据复杂条件分页查询")
public PageDTO<CommonVo> pageQuery(CommonQuery commonQuery) {
return commonService.queryCommonsPage(commonQuery);
}
Service
public interface ICommonService extends IService<Common> {
/**
* 根据复杂条件分页查询
*
* @param commonQuery
* @return
*/
PageDTO<CommonVo> queryCommonsPage(CommonQuery commonQuery);
}
ServiceImpl
@Service
public class CommonServiceImpl extends ServiceImpl<CommonMapper, Common> implements ICommonService {
/**
* 根据复杂条件分页查询
*
* @param commonQuery
* @return
*/
@Override
public PageDTO<CommonVo> queryCommonsPage(CommonQuery commonQuery) {
// 1. 构建查询条件
String username = commonQuery.getUsername();
Integer status = commonQuery.getStatus();
// 2. 构建分页条件
Page<Common> page = commonQuery.toMpPageDefaultSortByUpdateTime();
// 2. 分页查询
Page<Common> commonPage = lambdaQuery()
.like(username != null, Common::getUsername, username)
.eq(status != null, Common::getStatus, status)
.page(page);
// 3. 封装返回结果
// return PageDTO.of(commonPage, CommonVo.class); // 直接拷贝:拷贝字段要与被拷贝字段字段名一直
return PageDTO.of(commonPage, common -> {
// 1, 拷贝基础属性
CommonVo vo = BeanUtil.copyProperties(common, CommonVo.class);
// 2. 特殊处理
vo.setUsername(vo.getUsername().substring(0, 1) + "**");
return vo;
});
}
}
通用分页查询条件实体
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(description = "通用分页查询条件实体")
public class PageQuery {
@ApiModelProperty("页码")
private Integer pageNum = 1;
@ApiModelProperty("大小")
private Integer pageSize = 10;
@ApiModelProperty("排序字段")
private String sortBy;
@ApiModelProperty("是否升序")
private Boolean isAsc = true;
/**
* 构建分页条件
*
* @param items
* @param <T>
* @return
*/
public <T> Page<T> toMpPage(OrderItem... items) {
Page<T> page = Page.of(pageNum, pageSize);
if (StrUtil.isNotBlank(sortBy)) { // 不为空
page.addOrder(new OrderItem(sortBy, isAsc));
} else if (items != null) { // 为空 默认按照更新时间排序
page.addOrder(items);
}
return page;
}
public <T> Page<T> toMpPage(String defaultSortBy, Boolean defaultAsc) {
return toMpPage(new OrderItem(defaultSortBy, defaultAsc));
}
public <T> Page<T> toMpPageDefaultSortByCreateTime() {
return toMpPage(new OrderItem("create_time", false));
}
public <T> Page<T> toMpPageDefaultSortByUpdateTime() {
return toMpPage(new OrderItem("update_time", false));
}
}
通用分页查询结果实体
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 通用分页查询结果实体
*
* @param <T>
*/
@Data
@ApiModel(description = "分页结果")
public class PageDTO<T> {
@ApiModelProperty("总条数")
private Long total;
@ApiModelProperty("总页数")
private Long pages;
@ApiModelProperty("集合")
private List<T> list;
/**
* PO 转 VO 基础转换
*
* @param page
* @param clazz
* @param <PO>
* @param <VO>
* @return
*/
public static <PO, VO> PageDTO<VO> of(Page<PO> page, Class<VO> clazz) {
PageDTO<VO> dto = new PageDTO<>();
// 总条数
dto.setTotal(page.getTotal());
// 总页数
dto.setPages(page.getPages());
// 当前页数据
List<PO> records = page.getRecords();
if (CollUtil.isEmpty(records)) {
dto.setList(Collections.emptyList());
return dto;
}
dto.setList(BeanUtil.copyToList(records, clazz));
return dto;
}
/**
* PO 转 VO 自定义转换
*
* @param page
* @param convertor
* @param <PO>
* @param <VO>
* @return
*/
public static <PO, VO> PageDTO<VO> of(Page<PO> page, Function<PO, VO> convertor) {
PageDTO<VO> dto = new PageDTO<>();
// 总条数
dto.setTotal(page.getTotal());
// 总页数
dto.setPages(page.getPages());
// 当前页数据
List<PO> records = page.getRecords();
if (CollUtil.isEmpty(records)) {
dto.setList(Collections.emptyList());
return dto;
}
dto.setList(records.stream().map(convertor).collect(Collectors.toList()));
return dto;
}
}