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:通用分页实体封装
分页查询实体: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为例来说一下,在安装好MySQL8.0版本的前提下,如何添加环境变量。 二、目的 添加环…...

学习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的类名 : 验证码生成器包名修改:...

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

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

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

【性能测试】分布式压测之locust和Jmeter的使用
受限于单台机器的配置问题,我们在单台机器上达不到一个很高的压测并发数,那这个时候就需要引入分布式压测 分布式压测原理: 一般通过局域网把不同测试计算机链接到一起,达到测试共享、分散操作、集中管理的目的。 选择一台作为…...
ABC341A-D题解
文章目录 A题目AC Code: B题目AC Code: C题目AC Code: D题目你以为这就完了? 时间复杂度分析:AC Code: E A 题目 这个没什么好说的,就先输出一个 1,再输出 n n n 个 01就大功告成…...

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

Netty Review - NIO空轮询及Netty的解决方案源码分析
文章目录 Pre问题说明NIO CodeNetty是如何解决的?源码分析入口源码分析selectCntselectRebuildSelector Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty Review - 服务端channel注册流程源码解析 问题说明 N…...

PAM | 账户安全 | 管理
PAM PAM(Pluggable Authentication Modules,可插入式身份验证模块)是一个灵活的身份验证系统,允许我们通过配置和组合各种模块来实现不同的身份验证策略。 在 Linux 或类 Unix 系统中,常见的 PAM 模块包括以下几种类…...
Leetcode 16-20题
最接近的三数之和 给定整数数组和目标值target,从数组中选出三个整数,使得和与target最接近,并返回三数之和。保证恰好存在一个解。 和上一题类似,我们先对整数数组排序,然后固定i,枚举j,找到满…...
【开源训练数据集1】神经语言程式(NLP)项目的15 个开源训练数据集
一个聊天机器人需要大量的训练数据,以便在无需人工干预的情况下快速解决用户的询问。然而,聊天机器人开发的主要瓶颈是获取现实的、面向任务的对话数据来训练这些基于机器学习的系统。 我们整理了训练聊天机器人所需的对话数据集,包括问答数据、客户支持数据、对话数据和多…...

【AIGC】Stable Diffusion的ControlNet参数入门
Stable Diffusion 中的 ControlNet 是一种用于控制图像生成过程的技术,它可以指导模型生成特定风格、内容或属性的图像。下面是关于 ControlNet 的界面参数的详细解释: 低显存模式 是一种在深度学习任务中用于处理显存受限设备的技术。在这种模式下&am…...
静态curl库编译与使用(c++)
静态curl库编译与使用 静态curl库编译与使用:mingw https://curl.se/windows/ // 测试:设置URL地址 // curl_easy_setopt(curlHandle, CURLOPT_URL, “https://ipinfo.io/json”); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0L); // c…...

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

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

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

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

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

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...