MyBatis-Plus 分页失效问题解析:@Param 注解的影响与解决方案

引言

在 Spring Boot + MyBatis-Plus 的开发中,分页查询是常见的需求。

然而,有时我们会遇到分页失效的问题,尤其是在方法参数上添加 @Param 注解后。

本文将通过一个实际案例,分析 @Param 注解如何影响 MyBatis-Plus 的分页机制,并提供解决方案。


问题重现

1. 原始代码

AlertServiceImpl 中,分页查询方法 page() 调用了 AlertDaolist() 方法:

@Override
public PageData<AlertDTO> page(Map<String, Object> params) {IPage<AlertEntity> page = getPage(params, null, false);List<AlertDTO> list = baseDao.list(params);return getPageData(list, page.getTotal(), AlertDTO.class);
}

AlertDaolist() 方法如下:

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(@Param("p") Map<String, Object> params);

此时,分页失效,SQL 查询返回所有数据,而不是分页后的结果。

2. 修复后的代码

移除 @Param("p") 后,分页恢复正常:

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(Map<String, Object> params);

原因分析

1. MyBatis-Plus 的分页机制

MyBatis-Plus 的分页插件(PaginationInterceptor)会在执行 SQL 前自动解析分页参数(如 pagesize),并修改 SQL 添加 LIMIT 子句。

2. @Param 注解的影响

  • 不加 @Param:MyBatis-Plus 能直接读取 Map<String, Object> 中的分页参数(如 params.get("page")),并正确分页。
  • @Param("p"):整个 Map 被包装成命名参数 p,MyBatis-Plus 无法直接访问 p.pagep.size,导致分页插件无法识别分页参数,最终 SQL 没有 LIMIT 子句,返回全部数据。

解决方案

方案 1:移除 @Param 注解(推荐)

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(Map<String, Object> params);

优点

  • 保持 MyBatis-Plus 默认分页行为,无需额外修改 SQL。
  • 代码简洁,符合 MyBatis-Plus 最佳实践。

方案 2:手动分页(适用于必须使用 @Param 的情况)

如果必须使用 @Param,可以在 XML 中手动添加 LIMIT

<select id="list" resultType="io.installer.modules.sys.dto.AlertDTO">SELECT ...<where>hd.is_deleted=0</where>LIMIT #{p.page}, #{p.size}
</select>

缺点

  • 需要手动计算分页偏移量,容易出错。
  • 不适用于所有数据库(如 Oracle 需要使用 ROWNUM)。

方案 3:改用 IPage 参数(最佳 MyBatis-Plus 实践)

@DataSource(name = DataSourceNames.SECOND)
List<AlertDTO> list(IPage<AlertDTO> page, @Param("query") Map<String, Object> params);

优点

  • MyBatis-Plus 自动处理分页逻辑,无需手动干预。
  • 支持更灵活的分页查询。

总结

方案

适用场景

优点

缺点

移除 @Param

一般情况

简单高效

无法自定义参数名

手动分页

必须使用 @Param

可控性强

需要手动计算分页

IPage 参数

复杂分页查询

符合 MyBatis-Plus 最佳实践

需要调整方法签名

最佳实践建议

  • 优先移除 @Param**,让 MyBatis-Plus 自动处理分页。
  • 如需自定义参数名,可改用 IPage 参数 + @Param 组合。

结论

在 MyBatis-Plus 中,@Param 注解有时会干扰分页插件的参数解析机制,导致分页失效。通过移除 @Param 或改用 IPage 参数,可以确保分页功能正常工作。理解 MyBatis-Plus 的分页机制,有助于避免类似问题,提高开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95432.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——模型的简单优化

在训练模型时我们可能会遇到模型不满足于预期需要进行改善的环节&#xff0c;这些情况通常包括以下几种常见问题和对应的解决方案&#xff1a;数据质量不足数据量过少&#xff1a;当训练样本不足时&#xff0c;模型难以学习到有效的特征表示。建议通过数据增强&#xff08;如图…

17.MariaDB 数据库管理

17.MariaDB 数据库管理 数据库介绍 数据库&#xff08;Database&#xff09;简单来说&#xff0c;就是按照一定规则存数据的 “仓库”。它能高效存大量数据&#xff0c;还能方便地查、增、改、删数据&#xff0c;是各种信息系统的核心。 核心特点: 结构化存储&#xff1a;数…

AI抢饭碗,软件测试该何去何从?

AI 浪潮下&#xff0c;软件测试路在何方 当某大厂宣布 “AI 测试机器人上岗首日就覆盖 80% 的功能测试” 时&#xff0c;测试圈炸开了锅 —— 有人连夜更新简历&#xff0c;有人在技术论坛发问&#xff1a;“十年测试经验&#xff0c;难道真的不如一行 AI 代码&#xff1f;”AI…

09 ABP Framework 中的 MVC 和 Razor Pages

ABP Framework 中的 MVC 和 Razor Pages 该页面详细介绍了 ABP Framework 与 ASP.NET Core MVC 和 Razor Pages 的集成&#xff0c;涵盖框架组件、项目模板、主题系统和模块集成模式等内容&#xff0c;提供了 ABP 应用程序中传统的服务器端 Web UI 选项。 框架集成组件 ABP 提供…

docker 容器内编译onnxruntime

docker run -itd -p 49142:49142 --gpus "device0" --name cpp_env_20250812 --shm-size"5g" -v /本地路径/onnxruntime:/onnxruntime nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04进入容器内安装必要的依赖git clone --branch v1.13.1 --recursive https…

-bash: ll: 未找到命令

“ll” 并不是 Linux 系统的原生命令&#xff0c;而是 “ls -l” 命令的一个常用别名&#xff08;快捷方式&#xff09;。提示 “-bash: ll: 未找到命令” 说明你的系统中没有配置这个别名&#xff0c;只需手动添加即可&#xff1a;步骤&#xff1a;添加 ll 别名编辑当前用户的…

docker network 与host的区别

所以docker run的时候只需要加入指定的network&#xff0c;就会从该network自动分配对应的ip是吗 是的&#xff0c;你的理解完全正确&#xff01; Docker 网络自动分配 IP 机制 当你使用 docker run 命令并指定网络时&#xff0c;Docker 会自动从该网络的子网中分配一个 IP 地址…

GPT-5 现已上线 DigitalOcean Gradient™ AI 平台!

OpenAI 于 8 月 7 日发布其最新人工智能模型 GPT-5。根据 OpenAI 介绍&#xff0c;GPT-5 在编程、数学、写作、视觉等方面的性能全面领先&#xff0c;幻觉更低&#xff0c;指令更准。新架构整合高速模型与深度推理&#xff0c;可实时切换速答或深思。近日&#xff0c;DigitalOc…

#C语言——学习攻略:自定义类型路线--结构体--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言学习》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;“人理解迭代&#xff0c;神理解递归。” 目录 1. 结构体类型 1.1 旧知识回顾 1.1.1 结构体声…

机器学习——TF-IDF算法

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种广泛应用于文本挖掘和信息检索领域的经典加权算法&#xff0c;主要用于评估一个词语在文档集合中的重要程度。其核心思想是&#xff1a;一个词语在文档中出现的频率越高&#xff0c;同时在所有文…

区块链技术原理(9)-什么是以太币

文章目录前言什么是加密货币&#xff1f;什么是以太币&#xff08;ETH&#xff09;铸造 ETH燃烧 ETHETH 面额传输 ETH查询 ETH以太币的经济模型&#xff1a;发行与流通以太币与其他代币的区别以太币的历史与市场地位总结前言 以太币&#xff08;Ether&#xff0c;简称 ETH&…

【Oracle APEX开发小技巧16】交互式网格操作内容根据是否启用进行隐藏/展示

在日常开发中&#xff0c;有想要根据某一状态或条件去限制/隐藏对应权限或操作按钮的情况&#xff0c;于是用简报模板列表进行展示&#xff0c;并提供以下功能&#xff1a;显示模板基本信息提供启用/禁用模板的开关提供编辑模板的入口根据模板状态显示不同的操作选项效果展示&a…

AIStarter:全网唯一跨平台桌面AI管理工具,支持Windows、Mac和Linux一键部署

AIStarter作为全网唯一支持Windows、Mac和Linux的桌面AI管理平台&#xff0c;为开发者提供高效的项目管理、模型插件和工作流共享体验。最近&#xff0c;熊哥发布了4.1.0版本更新视频&#xff0c;详细演示了如何在多平台上安装、使用和分享AI项目。本文基于视频内容&#xff0c…

AP模式/ESP32作为TCP服务端,转发串口接收的数据给网络调试助手

此代码为接收STM32的数据然后直接转发到网络调试助手,当有设备连接到esp32软件热点时会通过串口发送字符’a’给STM32,当有设备断开连接时会通过串口发送字符’b’,ESP32的TX:GPIO4, RX:GPIO5ESP32作为TCP服务器地址为192.168.4.1 监听端口为3333#include <string.h> #in…

kafka 中的Broker 是什么?它在集群中起什么作用?

Kafka中的Broker&#xff1a;集群的核心支柱 在分布式消息系统Apache Kafka中&#xff0c;Broker是构成Kafka集群的核心节点或服务器。 简单来说&#xff0c;每一个Broker就是运行着Kafka服务的一个实例&#xff0c;多台Broker共同协作&#xff0c;形成了强大的、可扩展的消息处…

【SOA用于噪声抑制】光纤DFB激光器中弛豫振荡噪声抑制

概述&#xff1a;本章记录了我们在光纤分布式反馈DFB激光器中使用饱和SOA来降低RIN的工作&#xff0c;以用于低频传感器应用。结果表明&#xff0c;放大器的增益动力学允许光纤激光器的弛豫振荡RO噪声分量减少30dB。 1 背景到目前为止&#xff0c;我研究了将饱和半导体光放大器…

神经网络的核心组件解析:从理论到实践

神经网络作为深度学习的核心技术&#xff0c;其复杂性常常令人望而却步。然而&#xff0c;尽管神经网络的结构、参数和计算过程看似繁琐&#xff0c;但其核心组件却是相对简洁且易于理解的。本文将深入探讨神经网络的四大核心组件——层、模型、损失函数与优化器&#xff0c;并…

Spring Boot项目通过Feign调用三方接口的详细教程

目录 一、环境准备 二、启用Feign客户端 三、定义Feign客户端接口 四、定义请求/响应DTO 五、调用Feign客户端 六、高级配置 1. 添加请求头&#xff08;如认证&#xff09; 2. 超时配置&#xff08;application.yml&#xff09; 3. 日志配置 七、错误处理 自定义错误…

ubuntu24.04安装 bpftool 以及生成 vmlinux.h 文件

文章目录前言一、apt安装二、源码安装三、生成vmlinux.h参考资料前言 $ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04.2 LTS"$ uname -r 6.14.0-27-generic一、apt安装 安装bpftool&#xff1a; $ sudo apt install linux-tools-commonThe following NEW packa…

Pytorch FSDP权重分片保存与合并

注&#xff1a;本文章方法只适用Pytorch FSDP1的模型&#xff0c;且切分策略为SHARDED_STATE_DICT场景。 在使用FSDP训练模型时&#xff0c;为了节省显存通常会把模型权重也进行切分&#xff0c;在保存权重时为了加速保存通常每个进程各自保存自己持有的部分权重&#xff0c;避…