详细分析Mybatis与MybatisPlus中分页查询的差异(附Demo)
目录
- 前言
- 1. Mybatis
- 2. MybatisPlus
- 3. 实战
前言
更多的知识点推荐阅读:
- 【Java项目】实战CRUD的功能整理(持续更新)
- java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
本章节主要以Demo为例,直奔主题,对于更多的基本知识可看我的框架架构
1. Mybatis
主要的逻辑从外往深走,具体如下:
- 创建一个Java类,实现业务逻辑,在该类中调用上述接口中的方法获取分页数据并构建PageResult对象返回
- 创建一个Java接口,声明两个方法,分别用于执行这两个查询语句
- 创建XML映射文件,定义两个查询语句,分别用于获取分页列表和总记录数
主体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.system.mapper.UserMapper"><select id="fetchCustomPageResults"resultType="com.example.system.model.UserModel" >SELECT * FROM users<where><if test="criteria.name != null and criteria.name !=''">AND name LIKE CONCAT('%',#{criteria.name},'%')</if><if test="criteria.createTime != null">AND create_time BETWEEN #{criteria.createTime[0]}, #{criteria.createTime[1]},</if><if test="criteria.status != null">AND status = #{criteria.status}</if></where>ORDER BY id DESCLIMIT #{criteria.pageNumber}, #{criteria.pageSize}</select><select id="fetchCustomTotalCount" resultType="Long" >SELECT COUNT(1) FROM users<where><if test="criteria.name != null and criteria.name !=''">AND name LIKE CONCAT('%',#{criteria.name},'%')</if><if test="criteria.createTime != null">AND create_time BETWEEN #{criteria.createTime[0]}, #{criteria.createTime[1]},</if><if test="criteria.status != null">AND status = #{criteria.status}</if></where></select></mapper>
@Mapper
public interface CustomUserMapper extends BaseMapperX<UserModel> {/*** 获取自定义分页结果*/List<UserModel> fetchCustomPageResults(@Param("criteria") UserCriteria criteria);/*** 获取自定义总记录数*/Long fetchCustomTotalCount(@Param("criteria") UserCriteria criteria);}@Service
@Slf4j
public class CustomUserService {@Overridepublic PageResult<UserModel> fetchCustomUserPage(UserCriteria criteria) {return new PageResult<>(userMapper.fetchCustomPageResults(criteria),userMapper.fetchCustomTotalCount(criteria));}
}
对应实现类如下:
@Service
@Slf4j
public class CustomUserServiceImpl implements CustomUserService{private final CustomUserMapper userMapper;@Autowiredpublic CustomUserService(CustomUserMapper userMapper) {this.userMapper = userMapper;}@Overridepublic PageResult<UserModel> fetchCustomUserPage(UserCriteria criteria) {return new PageResult<>(userMapper.fetchCustomPageResults(criteria),userMapper.fetchCustomTotalCount(criteria));}
}
以上的Demo提供一个框架思路
2. MybatisPlus
具体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.system.mapper.AdminUserMapper"><select id="fetchCustomPageResults"resultType="com.example.system.model.UserModel" >SELECT * FROM users<where><if test="criteria.name != null and criteria.name !=''">AND username LIKE CONCAT('%',#{criteria.name},'%')</if><if test="criteria.createTime != null">AND create_time BETWEEN #{criteria.createTime[0]}, #{criteria.createTime[1]},</if><if test="criteria.status != null">AND status = #{criteria.status}</if></where>ORDER BY id DESC</select></mapper>
@Mapper
public interface CustomAdminUserMapper extends BaseMapperX<UserModel> {IPage<UserModel> fetchCustomPageResults(IPage<UserModel> page, @Param("criteria") UserCriteria criteria);}
其实现类如下:
@Service
@Slf4j
public class CustomUserServiceImpl implements CustomUserService{private final CustomAdminUserMapper userMapper;@Autowiredpublic CustomAdminUserService(CustomAdminUserMapper userMapper) {this.userMapper = userMapper;}@Overridepublic PageResult<UserModel> fetchCustomUserPage(UserCriteria criteria) {// 必须使用 MyBatis Plus 的分页对象IPage<UserModel> page = new Page<>(criteria.getPageNo(), criteria.getPageSize());userMapper.fetchCustomPageResults(page, criteria);return new PageResult<>(page.getRecords(), page.getTotal());}
}
3. 实战
看Demo示例可能有些抽象,结合自身项目给一个示例
Controller类如下:
@GetMapping("/listByOrderId")
@ApiOperationSupport(order = 8)
@ApiOperation(value = "分页", notes = "传入docheck")
public R<List<DoCheckVO>> list(Long orderId) {List<DoCheck> doChecks = docheckService.listByOrderId(orderId);return R.data(DocheckWrapper.build().listVO(doChecks));
}
对应的Service类如下:
List<DoCheck> listByOrderId(Long orderId);
其中的实现类如下:
@Override
public List<DoCheck> listByOrderId(Long orderId) {return docheckMapper.listByOrderId(orderId);
}
Mapper类如下:
List<DoCheck> listByOrderId(Long orderId);
对应的Xml代码如下:
<select id="listByOrderId" resultType="org.springblade.equipment.entity.DoCheck">select * from equipment_check_order_docheck where is_deleted = 0 and check_order_id=#{orderId}
</select>
其中xml的上文如下:

相关文章:
详细分析Mybatis与MybatisPlus中分页查询的差异(附Demo)
目录 前言1. Mybatis2. MybatisPlus3. 实战 前言 更多的知识点推荐阅读: 【Java项目】实战CRUD的功能整理(持续更新)java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) 本章节主要以Demo为例ÿ…...
nginx--tcp负载均衡
mysql负载均衡 安装mysql yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb ss -ntl创建数据库并授权 MariaDB [(none)]> create database wordpress; Query OK, 1 row affected (0.00 sec)MariaDB [(none)]> grant all privileges o…...
20240506 深度学习高级技术点
1.基于BN层剪枝 基于Batch Normalization (BN)层进行剪枝是一种常用的模型压缩方法,特别是在卷积神经网络(CNNs)中。BN层在训练期间用于加速收敛和提高模型的泛化能力,而在剪枝过程中,BN层提供的统计信息(特别是均值(mean)和方差…...
标准汽车试验铁地板的技术要求
在现代科技化发展的工作中,试验平台被广泛使用。铸铁试验平台(试验铁地板)又叫试验工作平台,听名字大家也不难想象出来这是一款带有箱式体的台面,这是一种有长方形或者圆形又或者正方形的试验工作台。 铸铁试验平台&a…...
【翻译】REST API
自动伸缩 API 创建或更新自动伸缩策略 API 此特性设计用于 Elasticsearch Service、Elastic Cloud Enterprise 和 Kubernetes 上的 Elastic Cloud 的间接使用。不支持直接用户使用。 创建或更新一个自动伸缩策略。 请求 PUT /_autoscaling/policy/<name> {"rol…...
TypeScript学习日志-第十九天(namespace命名空间)
namespace命名空间 一、基本用法 namespace 所有的变量以及方法必须要导出才能访问,如图: 二、 嵌套 namespace 可以进行嵌套使用,如图: 它也必须需要导出才能访问 三、合并 当我们出现两个同名的 namespace 它就会合并这两…...
Mac远程桌面windows11
文章目录 一、Mac安装Microsoft Remote Desktop二、Window11打开远程登录权限三、常见问题 一、Mac安装Microsoft Remote Desktop 下载地址:点击这里官方下载 基本不用看,凭感觉用就行。搞不定详情见:官方说明 二、Window11打开远程登录权…...
GPU术语
SP(Streaming Processor)流处理器 流处理器是GPU最基本的处理单元,在fermi架构开始被叫做CUDA core。 SM(Streaming MultiProcessor) 一个SM由多个CUDA core组成。SM还包括特殊运算单元(SFU),共享内存(shared memory),寄存器文件(Register …...
上海个人购房提取公积金经历和注意事项(收藏不踩坑)
在前一篇文章中,我介绍了 2024 年 4 月 24 日上海个人购房个税退税经历,我于 4 月 27 日周六,顺利办理租房公积金提取业务,资金在业务办理完成后 10 分钟左右到账。通过本文分享办理过程的材料和注意事项,避免大家踩坑…...
阿里云API网关 产品的使用笔记
阿里云的产品虽多,还是一如既往的一用一个看不懂,该模块的文档依旧保持“稳定”发挥,磕了半天才全部跑通。 用阿里云API网关的原因是,在Agent中写插件调用API的时候,需要使用Https协议,又嫌搞备案、证书等事…...
基于H.264的RTP打包中的组合封包以及分片封包结构图简介及抓包分析;FU-A FU-B STAP-A STAP-B简介;
H.264视频流的RTP封装类型分析: 前言: 1.RTP打包原则: RTP的包长度必须要小于MTU(最大传输单元),IP协议中MTU的最大长度为1500字节。除去IP报头(20字节)、UDP报头(8字节)、RTP头&a…...
OPENAI中Semantic Kernel实现原理以及示例代码用PYTHON来实现
OPENAI中Semantic Kernel实现原理以及示例代码用PYTHON来实现 前言 在人工智能领域,自然语言处理是一个非常重要的研究方向。而在自然语言处理中,语义理解是一个非常关键的问题。在这个领域中,OPENAI的Semantic Kernel是一个非常有名的工具…...
关于路由懒加载的实现
在Vue2中,实现路由懒加载可以使用import的动态引入方式。通常,我们可以将组件作为被引入的模块,并在routes配置中使用component: () > import(/components/Example.vue)来实现懒加载。 在Vue3中,懒加载的实现方式稍有不同。Vu…...
如何去官网下载windows10操作系统iso镜像
文章目录 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去二、然后按图示一步步点进去三、点击下载工具这个工具会帮你生成windows操作系统iso文件四、下载好后一步步按图示要求成功操作 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去 二、然后按图示一…...
JavaScript中如何实现函数缓存,函数缓存有哪些应用场景
函数缓存就是将函数运算的结果进行缓存。 本质上是利用空间换时间。 常用于缓存数据计算结果和缓存对象。缓存只是一个临时的数据存储,它保存数据,为了方便将来对该数据的请求时,可以更快的得到处理。 缓存函数 实现一个缓存函数…...
以中国为目标的DinodasRAT Linux后门攻击场景复现
概述 在上一篇《以中国为目标的DinodasRAT Linux后门剖析及通信解密尝试》文章中,笔者对DinodasRAT Linux后门的功能及通信数据包进行了简单剖析,实现了对DinodasRAT Linux后门心跳数据包的解密尝试。 虽然目前可对DinodasRAT Linux后门的通信数据包进…...
Day 24 数据库管理及数据类型
数据库管理及数据类型 一:数据类型 1.数值类型 整数类型 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT 作用:用于存储用户的年龄、游戏的Level、经验值等 浮点数类型 浮点数类型:FLOAT DOUBLE 作用…...
MAC 本地搭建Dify环境
Dify 介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过…...
vue3使用tsx/jsx时报错:JSX 元素隐式具有类型 “any“,因为不存在接口 “JSX.IntrinsicElements“。
vue3使用tsx/jsx时报错:JSX 元素隐式具有类型 "any",因为不存在接口 "JSX.IntrinsicElements"。 在项目中安装:npm install types/react npm install types/react...
卷价格不如卷工艺降本增效狠抓模块规范化设计
俗话说,“卷价格不如卷工艺”,这意味着在追求成本控制和效率提升的过程中,蓝鹏的领导认为蓝鹏应该更注重工艺的优化和创新,而不仅仅是价格的竞争。而模块规范化设计正是实现这一目标的有效途径。 模块规范化设计可以提高生产效率…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
新版NANO下载烧录过程
一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...
