当前位置: 首页 > news >正文

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.dtcms.com/a/328671.html

相关文章:

  • amis表单较验
  • Datawhale AI夏令营第三期多模态RAG方向 Task3
  • AAAI论文速递 | NEST:超图小世界网络让自动驾驶轨迹预测更精准
  • 基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算实践过程
  • 从聚合到透视:SQL 窗口函数的系统解读
  • 谷歌、facebook、tiktok广告账户多开怎么安全?亚马逊、ebay、shopee多店铺怎么做好?看看adspower工具,注册免费试用及实用技巧分享
  • SQL详细语法教程(一)--数据定义语言(DDL)
  • 基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算)实践
  • 4G模块 ML307A通过MQTT协议连接到阿里云
  • 数据科学与爬虫技术学习笔记
  • 基于机器学习的自动驾驶汽车新型失效运行方法
  • Win11和Mac设置环境变量
  • 【汽车标定数据】动态优先级线程池在异步多文件解析中的应用
  • 2022 年全国硕士研究生招生考试真题笔记
  • 深度学习赋能汽车制造缺陷检测
  • “我店模式”:零售转型中的场景化突围
  • 美团搜索推荐统一Agent之交互协议与多Agent协同
  • 【计算机网络 | 第6篇】计算机体系结构与参考模型
  • go学习笔记-匿名函数
  • 算法题笔记
  • Java连接MySQL数据库
  • Socket 套接字常用方法
  • Java多源AI接口融合框架:动态模型切换与智能路由实战
  • pybind11绑定C++项目心得
  • Sentinel 和 Hystrix
  • MySQL 存储过程终止执行的方法
  • 力扣热题100------279.完全平方数
  • XGBoost 的适用场景以及与 CNN、LSTM 的区别
  • AQS的原理与ReentrantLock的关系
  • 基于Rocky Linux 9的容器化部署方案,使用Alpine镜像实现轻量化