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文件夹和文…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
