MyBatisPlus-分页插件


一、配置

如果想要使用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;
    }
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis-Plus提供了几种通用的分页查询方法。其中,无条件分页查询的方法包括: - `IPage<T> page(IPage<T> page)` - `IPage<Map<String, Object>> pageMaps(IPage<T> page)` 而条件分页查询的方法包括: - `IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper)` - `IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper)` 这些方法可以在service层的自定义接口的mapper中使用。例如,在`CustomerService`接口中,可以直接使用这些方法进行分页查询操作。123 #### 引用[.reference_title] - *1* [springboot+mybatisPlus ---分页查询](https://blog.csdn.net/m0_72309077/article/details/128906871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [MybatisPlus - 分页插件使用](https://blog.csdn.net/qiaohao0206/article/details/125432460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [SpringBoot整合MybatisPlus-分页](https://blog.csdn.net/qq_60506984/article/details/128843948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monly21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值