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"
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/394502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

基于SSM的电影购票系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影购票系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Eclipse 分栏显示同一文件

Eclipse 分栏显示同一文件 1. Window -> EditorReferences 1. Window -> Editor Toggle Split Editor (Horizontal) &#xff1a;取消或设置水平分栏显示 Toggle Split Editor (Vertical) &#xff1a;取消或设置垂直分栏显示 References [1] Yongqiang Cheng, https:/…

综合特征融合的实用图像恢复技术-CMFNet

综合特征融合的实用图像恢复技术-CMFNet 综合特征融合的实用图像恢复技术-CMFNet项目背景与意义模型架构与关键思想代码实现与功能函数恢复效果展示参考资料 综合特征融合的实用图像恢复技术-CMFNet 图像恢复一直是计算机视觉领域的重要研究方向之一。它涵盖了诸多任务&#x…

K8s服务发现组件之CoreDNS/NodeLocalDNS /kubeDNS

1 coredns 1.1 概述 1.1.1 什么是CoreDNS CoreDNS 是一个灵活可扩展的 DNS 服务器&#xff0c;可以作为 Kubernetes 集群 DNS&#xff0c;在Kubernetes1.12版本之后成为了默认的DNS服务。 与 Kubernetes 一样&#xff0c;CoreDNS 项目由 CNCF 托管。 coredns在K8S中的用途,…

Docker原理及概念相关

Docker最核心的组件 image&#xff1a;镜像&#xff0c;构建容器&#xff0c;也可以通过Dockerfile文本描述镜像的内容。 (我们将应用程序运行所需的环境&#xff0c;打包为镜像文件) Container&#xff1a;容器 (你的应用程序&#xff0c;就跑在容器中 ) 镜像仓库(dockerhub)(…

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

背景 基于前面搭建的3节点 Kubernetes 集群&#xff0c;今天我们使用 Registry2 搭建私有镜像仓库&#xff0c;这在镜像安全性以及离线环境下运维等方面具有重要意义。 Note: 由于是测试环境&#xff0c;以下创建了一个 local-storage 的 StorageClass &#xff0c;并使用本地…

CSP-201812-1-小明上学

CSP-201812-1-小明上学 解题思路 #include <iostream> using namespace std; int main() {int red, yellow, green, n, timeSum 0;cin >> red >> yellow >> green;cin >> n;for (int i 0; i < n; i){int flag, time;cin >> flag &g…

什么是“感知机”?

感知机&#xff08;神经网络和支持向量机的理论基础&#xff09; 概念&#xff1a;简单来说&#xff0c;感知机就是一个旨在建立一个线性超平面对线性可分的数据集进行分类的线性模型 分类&#xff1a; 单层感知机多层感知机&#xff08; Multi-Layer Perceptron&#xff0c…

不同品牌和种类的电容与电感实测对比(D值、Q值、ESR、X)

最近买了个LCR电桥&#xff0c;就想测一下手头上的各种电容电感的参数&#xff0c;对比一下。 测试设备是中创ET4410&#xff0c;测量的参数有&#xff1a;电容值、电感值、D(损耗角正切值)、Q(品质因数)、ESR(等效串联电阻)、X(电抗&#xff0c;通常表示为感抗XL或容抗XC)。 …

css2背景

css2背景 一.背景颜色二.背景图片三.背景平铺四.背景图片位置五.背景图像固定六.复合型写法七.背景颜色半透明八.总结 一.背景颜色 默认是transparent(透明&#xff09; 二.背景图片 默认是none 三.背景平铺 默认是background-repeat(平铺&#xff09; 四.背景图片位置…

如何根据需求理解CPU、SoC和MCU的区别

在当今数字化的世界中&#xff0c;我们经常听到关于CPU、SoC和MCU的名词&#xff0c;它们都是计算机科学和电子工程领域中的重要组成部分。然而&#xff0c;这三者之间存在着明显的区别。本文将深入探讨CPU&#xff08;中央处理器&#xff09;、SoC&#xff08;系统芯片&#x…

STM32 学习2 库函数控制GPIO输出

STM32 学习2 库函数控制GPIO输出 一、GPIO寄存器介绍1. GPIO简介2. GPIO功能&#xff08;1&#xff09;模式分类&#xff08;2&#xff09;模式设置方法MODE[1:0]&#xff1a;模式控制&#xff0c;用于配置端口引脚的模式&#xff1a;CNF[1:0]&#xff1a;配置引脚输出速度&…

一.重新回炉Spring Framework: 理解Spring IoC

1. 写在前面的话 说实话&#xff0c;从事java开发工作时间也不短了&#xff0c;对于Spring Framework&#xff0c;也是天天用&#xff0c;这期间也碰到了很多问题&#xff0c;也解决了很多问题。可是&#xff0c;总感觉对Spring Framework还是一知半解&#xff0c;不能有个更加…

有趣的CSS - 新拟态输入框

我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;《有趣的css》系列已更新 11 篇了&#xff0c;今天这篇是关于新拟态风格的一个输入框效果&#xff0c;希望你们喜欢。 目录 页面效果核心代码html代码css代码 完整代码html页面css样式 页面效果 此效果使用 css 中 b…

计算机组成原理(4)-----Cache的原理及相关知识点

目录 1.Cache的原理 2.Cache的性能 3.Cache和主存的映射方式 &#xff08;1&#xff09;全相联映射 &#xff08;2&#xff09;直接映射 &#xff08;3&#xff09;组相联映射 4.替换算法 (1)随机算法(RAND) (2)先进先出算法(FIFO) (3)近期最少使用(LRU) (4)最近不经…

Netty通信框架功能设计

源码部分请见Netty的高级用法(一) 功能描述 通信框架承载了业务内部各模块之间的消息交互和服务调用&#xff0c;它的主要功能如下: 基于Netty的NIO通信框架&#xff0c;提供高性能的异步通信能力提供消息的编解码框架&#xff0c;可以实现POJO的序列化和反序列化消息内容的…

使用 apt 源安装 ROCm 6.0.x 在Ubuntu 22.04.01

从源码编译 rocSolver 本人只操作过单个rocm版本的情景&#xff0c;20240218 ubuntu 22.04.01 1&#xff0c;卸载原先的rocm https://docs.amd.com/en/docs-5.1.3/deploy/linux/os-native/uninstall.html # Uninstall single-version ROCm packages sudo apt autoremove ro…

IO 流分类

一、File File 类&#xff08;磁盘操作&#xff09;可以用于表示文件和目录的信息&#xff0c;但是它不表示文件的内容。递归地列出一个目录下所有文件&#xff1a; public static void listAllFiles(File dir) {if (dir null || !dir.exists()) {return;}if (dir.isFile())…

收藏 数据结构链表的知识点总结

数据结构链表知识点总结 1. 链表的基本概念 - 链表是一种线性数据结构&#xff0c;由一系列节点&#xff08;或元素&#xff09;组成。 - 每个节点包含两部分&#xff1a;数据域和指针域&#xff08;或称为链接&#xff09;。 - 指针域存储指向下一个节点的地址&#xff0c…