当前位置: 首页 > news >正文

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();//转换为voif (CollectionUtils.isEmpty(records)) {pageDTO.setList(Collections.emptyList());return pageDTO;}//forList<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();//转换为voif (CollectionUtils.isEmpty(records)) {pageDTO.setList(Collections.emptyList());return pageDTO;}List<VO> voList = records.stream().map(convertor).collect(Collectors.toList());pageDTO.setList(voList);//返回结果return pageDTO;}}

使用示例

封装之前

  @Overridepublic 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();//转换为voif (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;}

封装之后

  @Overridepublic 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->VOreturn 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"
}

 

相关文章:

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

分页查询实体&#xff1a;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.St…...

MVC 、DDD(domain-driven design,软件主动学习业务)、中台、Java SPI(Service Provider Interface)

文章目录 引言I 单体架构DDD实现版本1.1 核心概念1.2 DDD四层架构规范1.3 案例1.4 请求转发流程II 领域服务调用2.1 菱形对称架构2.2 中台III Java SPI3.1 概念3.2 实现原理3.3 例子:本地SPI找服务see alsojava -cp<...

添加环境变量

目录 一、前言二、目的三、添加环境变量的步骤四、检查环境变量是否配置成功 一、前言 在很多地方在下载完软件后都需要添加环境变量方可使用。这里以要在终端使用MySQL为例来说一下&#xff0c;在安装好MySQL8.0版本的前提下&#xff0c;如何添加环境变量。 二、目的 添加环…...

学习Android的第十六天

目录 Android 自定义 Adapter Adapter 接口 SpinnerAdapter ListAdapter BaseAdapter 自定义 BaseAdapter 参考文档 Android ListView 列表控件 ListView 的属性和方法 表头表尾分割线的设置 列表从底部开始显示 android:stackFromBottom 设置点击颜色 cacheColorH…...

若依项目改造

ctrlalt l 格式化项目 alt f6 修改包和import包名 替换com.ruoyi 为 com.cj 替换若依版本为自己的版本 将ruoyi改成自己项目的英文名 修改中文名字 修改文件包名 修改有ruoyi的类名 &#xff1a; 验证码生成器包名修改&#xff1a;...

相机图像质量研究(34)常见问题总结:图像处理对成像的影响--拖影

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

算法学习系列(三十五):贪心(杂)

目录 引言一、合并果子&#xff08;Huffman树&#xff09;二、排队打水&#xff08;排序不等式&#xff09;三、货仓选址&#xff08;绝对值不等式&#xff09;四、耍杂技的牛&#xff08;推公式&#xff09; 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…...

嵌入式面试:瑞芯微

文章目录 一、2024 秋招1.1 IIC的速率范围 &#xff1a;1.2 linux驱动子系统汇总 &#xff1a;1.3 linux关抢占情况汇总 &#xff1a;1.4 操作或者读写一个文件时&#xff0c;从用户态到内核态再到物理介质的流程(考点&#xff1a;虚拟文件系统) &#xff1a; 一、2024 秋招 1…...

【性能测试】分布式压测之locust和Jmeter的使用

受限于单台机器的配置问题&#xff0c;我们在单台机器上达不到一个很高的压测并发数&#xff0c;那这个时候就需要引入分布式压测 分布式压测原理&#xff1a; 一般通过局域网把不同测试计算机链接到一起&#xff0c;达到测试共享、分散操作、集中管理的目的。 选择一台作为…...

ABC341A-D题解

文章目录 A题目AC Code&#xff1a; B题目AC Code&#xff1a; C题目AC Code&#xff1a; D题目你以为这就完了&#xff1f; 时间复杂度分析&#xff1a;AC Code&#xff1a; E A 题目 这个没什么好说的&#xff0c;就先输出一个 1&#xff0c;再输出 n n n 个 01就大功告成…...

计算机网络——07协议层次及服务模型

协议层次及服务模型 协议层次 网络是一个复杂的系统 网络功能复杂&#xff1a;数字信号的物理信号承载、点到点、路由、rdt、进程区分、应用等现实来看&#xff0c;网络的许多构成元素和设备&#xff1a; 主机路由器各种媒体的链路应用协议硬件&#xff0c;软件 问题是&am…...

Netty Review - NIO空轮询及Netty的解决方案源码分析

文章目录 Pre问题说明NIO CodeNetty是如何解决的&#xff1f;源码分析入口源码分析selectCntselectRebuildSelector Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty Review - 服务端channel注册流程源码解析 问题说明 N…...

PAM | 账户安全 | 管理

PAM PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插入式身份验证模块&#xff09;是一个灵活的身份验证系统&#xff0c;允许我们通过配置和组合各种模块来实现不同的身份验证策略。 在 Linux 或类 Unix 系统中&#xff0c;常见的 PAM 模块包括以下几种类…...

Leetcode 16-20题

最接近的三数之和 给定整数数组和目标值target&#xff0c;从数组中选出三个整数&#xff0c;使得和与target最接近&#xff0c;并返回三数之和。保证恰好存在一个解。 和上一题类似&#xff0c;我们先对整数数组排序&#xff0c;然后固定i&#xff0c;枚举j&#xff0c;找到满…...

【开源训练数据集1】神经语言程式(NLP)项目的15 个开源训练数据集

一个聊天机器人需要大量的训练数据,以便在无需人工干预的情况下快速解决用户的询问。然而,聊天机器人开发的主要瓶颈是获取现实的、面向任务的对话数据来训练这些基于机器学习的系统。 我们整理了训练聊天机器人所需的对话数据集,包括问答数据、客户支持数据、对话数据和多…...

【AIGC】Stable Diffusion的ControlNet参数入门

Stable Diffusion 中的 ControlNet 是一种用于控制图像生成过程的技术&#xff0c;它可以指导模型生成特定风格、内容或属性的图像。下面是关于 ControlNet 的界面参数的详细解释&#xff1a; 低显存模式 是一种在深度学习任务中用于处理显存受限设备的技术。在这种模式下&am…...

静态curl库编译与使用(c++)

静态curl库编译与使用 静态curl库编译与使用&#xff1a;mingw https://curl.se/windows/ // 测试&#xff1a;设置URL地址 // curl_easy_setopt(curlHandle, CURLOPT_URL, “https://ipinfo.io/json”); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0L); // c…...

element 表单提交图片(表单上传图片)

文章目录 使用场景页面效果前端代码 使用场景 vue2 element 表单提交图片   1.点击【上传图片】按钮择本地图片&#xff08;只能选择一张图片&#xff09;后。   2.点击图片&#xff0c;支持放大查看。   3.点击【保存】按钮&#xff0c;提交表单。 页面效果 前端代码…...

Android 15 第一个开发者预览版

点击查看&#xff1a;first-developer-preview-android15 点击查看&#xff1a;Get Android 15 2024年2月16日,谷歌发布 Android 15 第一个开发者预览版 翻译 由工程副总裁戴夫伯克发布 今天&#xff0c;我们发布了Android 15的首个开发者预览版&#xff0c;这样我们的开发者就…...

anomalib1.0学习纪实-续1:增加新算法

0、基本信息 现在我要增加一个新算法&#xff1a;DDAD 他的代码&#xff0c;可以在github中找到&#xff1a;GitHub - arimousa/DDAD 一、基础操作&#xff1a; 1、修改anomalib\src\anomalib\models\__init__.py 我增加的第33行和61行&#xff0c; 2、 增加ddad文件夹和文…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...