MyBatis-Plus:通用分页实体封装

分页查询实体:PageQuery

package com.example.demo.demos.model.query;


import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import org.springframework.util.StringUtils;

/**
 * 分页查询实体
 */
@Data
public class PageQuery {

    //页码
    private Integer pageNo = 1;

    //分页大小
    private Integer pageSize = 10;

    //排序字段
    private String sortBy;

    //是否升序
    private Boolean isIncrease = true;

    /**
     * PageQuery转Page
     *
     * @param orderItem 排序条件
     * @return Page对象
     */
    public <T> Page<T> toMyBatisPlusPage(OrderItem... orderItem) {
        //TODO:构建分页条件
        //分页条件
        Page<T> page = new Page<>(pageNo, pageSize);
        //排序条件
        if (StringUtils.hasText(sortBy)) {
            page.addOrder(new OrderItem(sortBy, isIncrease));
        } else if (orderItem != null) {
            //默认按照更新时间排序-[此处改为默认按照id排序]
            page.addOrder(orderItem);
        }
        //返回
        return page;
    }

    /**
     * PageQuery转Page:根据Id排序
     *
     * @param orderBy    排序字段
     * @param isIncrease 是否升序
     * @return Page对象
     */
    public <T> Page<T> toMyBatisPlusPage(String orderBy, Boolean isIncrease) {
        return toMyBatisPlusPage(new OrderItem(orderBy, isIncrease));
    }

    /**
     * PageQuery转Page:根据Id排序
     *
     * @return Page对象
     */
    public <T> Page<T> toMyBatisPlusPageSortById() {
        return toMyBatisPlusPage(new OrderItem("id", true));
    }

    /**
     * PageQuery转Page:根据create_time排序
     *
     * @return Page对象
     */
    public <T> Page<T> toMyBatisPlusPageSortByCreateTime() {
        return toMyBatisPlusPage(new OrderItem("create_time", true));
    }

    /**
     * PageQuery转Page:根据update_time排序
     *
     * @return Page对象
     */
    public <T> Page<T> toMyBatisPlusPageSortByUpdateTime() {
        return toMyBatisPlusPage(new OrderItem("update_time", true));
    }
}

分页响应实体:PageDTO

package com.example.demo.demos.model.dto;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 分页查询结果
 */
@Data
public class PageDTO<T> {

    //总条数
    private Long total;

    //总页数
    private Long pages;

    //集合
    private List<T> list;

    /**
     * Page转换为PageDTO
     *
     * @param page  MyBatis Plus分页对象
     * @param clazz 类型参数
     * @return PageDTO
     */
    public static <PO, VO> PageDTO<VO> of(Page<PO> page, Class<VO> clazz) {
        //TODO:构建Vo结果
        PageDTO<VO> pageDTO = new PageDTO<>();
        //总条数
        pageDTO.setTotal(page.getTotal());
        //总页数
        pageDTO.setPages(page.getPages());
        //当前页数据
        List<PO> records = page.getRecords();
        //转换为vo
        if (CollectionUtils.isEmpty(records)) {
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }
        //for
        List<VO> voList = new ArrayList<>(records.size());
        records.forEach(po -> {
            try {
                VO vo = clazz.newInstance();
                BeanUtils.copyProperties(po, vo, clazz);
                voList.add(vo);
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        });
        pageDTO.setList(voList);
        //返回结果
        return pageDTO;
    }


    /**
     * Page转换为PageDTO-【自定义PO->VO的转换方法】
     *
     * @param page  MyBatis Plus分页对象
     * @param convertor PO->VO的转换逻辑
     * @return PageDTO
     */
    public static <PO, VO> PageDTO<VO> of(Page<PO> page, Function<PO,VO> convertor) {
        //TODO:构建Vo结果
        PageDTO<VO> pageDTO = new PageDTO<>();
        //总条数
        pageDTO.setTotal(page.getTotal());
        //总页数
        pageDTO.setPages(page.getPages());
        //当前页数据
        List<PO> records = page.getRecords();
        //转换为vo
        if (CollectionUtils.isEmpty(records)) {
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }
        List<VO> voList = records.stream().map(convertor).collect(Collectors.toList());
        pageDTO.setList(voList);
        //返回结果
        return pageDTO;
    }


}

使用示例

封装之前

  @Override
    public PageDTO<ProductVo> queryProductsPage(ProductQuery productQuery) {
        //获取参数
        String name = productQuery.getName();
        Boolean status = productQuery.getStatus();
        Double minPrice = productQuery.getMinPrice();
        Double maxPrice = productQuery.getMaxPrice();
        //TODO:构建分页条件
        //分页条件
        Page<Product> page = new Page<>(productQuery.getPageNo(), productQuery.getPageSize());
        //排序条件
        if (StringUtils.hasText(productQuery.getSortBy())){
            page.addOrder(new OrderItem(productQuery.getSortBy(),productQuery.getIsIncrease()));
        }else{
            //默认按照更新时间排序-[此处改为默认按照id排序]
            page.addOrder(new OrderItem("id",true));
        }
        //TODO:分页查询
        Page<Product> pageResult = lambdaQuery()
                .like(name != null && name != "", Product::getName, name)
                .eq(status != null, Product::getStatus, status)
                .ge(minPrice != null && minPrice != 0, Product::getPrice, minPrice)
                .le(maxPrice != null && maxPrice != 0, Product::getPrice, maxPrice)
                .page(page);
        //TODO:构建Vo结果
        PageDTO<ProductVo> productPageDTO = new PageDTO<>();
        //总条数
        productPageDTO.setTotal(pageResult.getTotal());
        //总页数
        productPageDTO.setPages(pageResult.getPages());
        //当前页数据
        List<Product> records = pageResult.getRecords();
        //转换为vo
        if (CollectionUtils.isEmpty(records)){
            productPageDTO.setList(Collections.emptyList());
            return productPageDTO;
        }
        //返回结果
        List<ProductVo> productVoList = records.stream().map(product -> {
            ProductVo productVo = new ProductVo();
            BeanUtils.copyProperties(product, productVo);
            return productVo;
        }).collect(Collectors.toList());
        productPageDTO.setList(productVoList);
        return productPageDTO;
    }

封装之后

  @Override
    public PageDTO<ProductVo> queryProductsPage(ProductQuery productQuery) {
        //获取参数
        String name = productQuery.getName();
        Boolean status = productQuery.getStatus();
        Double minPrice = productQuery.getMinPrice();
        Double maxPrice = productQuery.getMaxPrice();
        //TODO:构建分页条件
        //调用封装好的方法
        Page<Product> page = productQuery.toMyBatisPlusPageSortById();
        //TODO:分页查询
        Page<Product> pageResult = lambdaQuery()
                .like(name != null && name != "", Product::getName, name)
                .eq(status != null, Product::getStatus, status)
                .ge(minPrice != null && minPrice != 0, Product::getPrice, minPrice)
                .le(maxPrice != null && maxPrice != 0, Product::getPrice, maxPrice)
                .page(page);
        //TODO:构建Vo结果
        //方式1:默认转换PO->VO
//        return PageDTO.of(pageResult, ProductVo.class);
        //方式2:自定义转换PO->VO
        return PageDTO.of(pageResult,(product -> {
            //自定义转换逻辑
            ProductVo productVo = new ProductVo();
            BeanUtils.copyProperties(product,productVo);
            return productVo;
        }));
    }

接口测试

        这里省略Controller、Mapper、Model、Service等其它代码。

        查询参数:

查询参数

        查询结果:

{
    "code": 200,
    "data": {
        "total": 3,
        "pages": 2,
        "list": [
            {
                "id": 2,
                "name": "冰可乐",
                "price": 12.12,
                "address": "淮阳",
                "status": false,
                "createTime": "2024-02-18 00:35:07",
                "updateTime": null,
                "enumState": 2,
                "info": "{\"bar\": \"baz\", \"balance\": 7.77, \"active\": false}"
            },
            {
                "id": 4,
                "name": "雪糕",
                "price": 38.47,
                "address": "阜阳",
                "status": true,
                "createTime": "2024-02-18 01:23:12",
                "updateTime": null,
                "enumState": 1,
                "info": "{\"bar\": \"baz\", \"balance\": 7.77, \"active\": false}"
            }
        ]
    },
    "message": "ok"
}

 

相关推荐

  1. MyBatis-Plus 实现

    2024-02-18 14:24:03       48 阅读
  2. MyBatis-Plus查询

    2024-02-18 14:24:03       65 阅读
  3. Spring Boot整合MyBatis-Plus以及实现

    2024-02-18 14:24:03       36 阅读
  4. spring boot Mybatis Plus

    2024-02-18 14:24:03       44 阅读
  5. MyBatis-plus笔记——插件

    2024-02-18 14:24:03       35 阅读
  6. MyBatis如何实现

    2024-02-18 14:24:03       27 阅读
  7. 使用Mybatis-plus查询的Total与实际条数不对应

    2024-02-18 14:24:03       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-18 14:24:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-18 14:24:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-18 14:24:03       87 阅读
  4. Python语言-面向对象

    2024-02-18 14:24:03       96 阅读

热门阅读

  1. MongoDB聚合运算符:$add

    2024-02-18 14:24:03       55 阅读
  2. OJ 蚂蚁花呗问题

    2024-02-18 14:24:03       45 阅读
  3. 物业第三方满意度调查如何执行

    2024-02-18 14:24:03       50 阅读
  4. Android studio:错误: 需要常量表达式

    2024-02-18 14:24:03       61 阅读
  5. 二.自定义头文件

    2024-02-18 14:24:03       43 阅读
  6. 【C语言】pq->rear->next = pnew与pq->rear = pnew

    2024-02-18 14:24:03       50 阅读
  7. Vite之对CSS的处理方式及使用

    2024-02-18 14:24:03       50 阅读
  8. Spring Boot注入PasswordEncoder失败

    2024-02-18 14:24:03       51 阅读
  9. 【nginx实践连载-2】多应用安装部署

    2024-02-18 14:24:03       48 阅读
  10. Texas Instruments 在 GitHub 的官方主页

    2024-02-18 14:24:03       56 阅读