详细分析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...
卷价格不如卷工艺降本增效狠抓模块规范化设计
俗话说,“卷价格不如卷工艺”,这意味着在追求成本控制和效率提升的过程中,蓝鹏的领导认为蓝鹏应该更注重工艺的优化和创新,而不仅仅是价格的竞争。而模块规范化设计正是实现这一目标的有效途径。 模块规范化设计可以提高生产效率…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
