【MyBatis】MyBatis 报错:Parameter ‘xxx‘ not found - 实践

news/2025/10/25 20:37:40/文章来源:https://www.cnblogs.com/wzzkaifa/p/19165939

MyBatis 报错:Parameter ‘xxx’ not found

错误信息示例:

Parameter ‘testId’ not found. Available parameters are [arg1, arg0, param1, param2]

本文结合实际项目中的一次问题定位与修复过程,系统性分析 MyBatis 中常见的参数名解析问题,解释根因、重现方式、排查路径、正确写法与最佳实践,帮助你在遇到类似错误时高效定位与修复。


一、错误现象与触发场景

我们在新增整编需求时,需要根据 testIdageIddata_collection_requirement 表里查询对应的 form_number。Mapper 方法与 XML 大致如下:

String selectFormNumberByTestAndyage(Long testId, Long ageId);
  • Mapper XML(配套 SQL)
<select id="selectFormNumberByTestAndyage" resultType="String">select form_numberfrom data_collection_requirementwhere test_task_id = #{testId}and voyage_id    = #{ageId}limit 1
</select>

执行时报错:

  • Parameter ‘testId’ not found. Available parameters are [arg1, arg0, param1, param2]

这意味着 MyBatis 在解析参数名称时没有识别到 testId,而是只看到了默认生成的参数别名 arg0/arg1/param1/param2


二、根因分析:MyBatis 如何识别多参数名称

在 Mapper 接口方法有多个参数时,如果未开启 Java 编译参数名保留或未显式标注 @Param,MyBatis 无法获取源码中的真实参数名,只能分配默认名:

  • 第一个参数:arg0 / param1
  • 第二个参数:arg1 / param2
  • 以此类推

因此,XML 中使用 #{testId}#{ageId} 时会找不到对应名称,触发上述错误。

常见导致该问题的几种情况:

  • 未使用 @Param 指定参数名;
  • 工程未通过 -parameters 编译选项保留参数名;
  • Lombok/代理/多层调用导致参数名信息丢失;
  • 混用 XML 中的 #{xxx} 与接口未命名的参数。

三、三种可行修复方案(从业务稳定性角度推荐优先级)

方案 A(推荐):使用 @Param 显式命名

在 Mapper 接口方法参数上标注 @Param,强制为每个参数指定稳定的名称:

import org.apache.ibatis.annotations.Param;
String selectFormNumberByTestAndage(
@Param("testId") Long testId,
@Param("ageId") Long ageId);

XML 不变:

where test_task_id = #{testId}and voyage_id    = #{ageId}

优点:明确稳定,不依赖编译器或构建参数,团队协作成本最低。

方案 B:启用编译参数保留(可选辅助)

在 Maven/Gradle 中开启 -parameters,让 MyBatis 能读取到真实参数名:

  • Maven 示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId><configuration><compilerArgs><arg>-parameters</arg></compilerArgs></configuration>
</plugin>

注意:不同 JDK 或构建链路、代理增强等仍可能导致参数名不可用,因此通常与 @Param 搭配更稳妥。

方案 C:在 XML 中使用默认别名(不推荐)

直接改 XML 使用 #{param1}#{param2}

where test_id = #{param1}and age_id    = #{param2}

缺点:可读性差、易出错,接口参数顺序变动就会引入隐藏问题。


四、实战案例:从报错到修复的完整过程

  • 报错:
Parameter 'testId' not found. Available parameters are [arg1, arg0, param1, param2]
  • 触发 SQL:
<select id="selectFormNumberByTestAndage" resultType="String">select form_numberfrom data_collection_requirementwhere test_task_id = #{testId} and voyage_id = #{ageId}limit 1
</select>
  • 修复:为 Mapper 接口参数添加 @Param 注解:
String selectFormNumberByTestAndage(
@Param("testId") Long testId,
@Param("ageId") Long ageId);
  • 结果:问题消失,SQL 正常执行,form_number 成功回填。

五、排查清单(Checklist)

  1. Mapper 接口是否为多参数?若是,尽量使用 @Param 明确命名。
  2. XML 中 #{xxx} 与接口参数名是否一一对应?是否存在拼写差错?
  3. 是否开启了 -parameters?即便开启,也建议使用 @Param 保底。
  4. 是否有 AOP/代理/字节码增强导致参数名丢失?
  5. 是否混用了注解 SQL 与 XML,参数名是否一致?

六、相关最佳实践


七、扩展:为什么 Available parameters 里有两套命名?

MyBatis 为了兼容性,会同时提供 argNparamN 两套下标式别名:

  • arg0/arg1/... 与方法参数顺序一一对应;
  • param1/param2/... 也是按顺序,从 1 开始计数;

当你看见错误里只有这些别名,而没有你的业务名时,几乎可以断定是未识别到真实参数名导致。


八、结论


九、参考与进一步阅读

  • MyBatis 官方文档:Mapper XML FilesMapper Interfaces
  • MyBatis Github Issues 中关于参数名与 -parameters 的讨论
  • 团队内代码规范与示例库(建议新增多参数映射的标准模板)

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

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

相关文章

深入解析:3. 从0到上线:.NET 8 + ML.NET LTR 智能类目匹配实战--从业务到方案:消费类目智能匹配的整体设计

深入解析:3. 从0到上线:.NET 8 + ML.NET LTR 智能类目匹配实战--从业务到方案:消费类目智能匹配的整体设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

xyd 2025 S 模拟赛

8 + 100 + 50 + 55 = 213, Rank 15/323.是怎么注意到 \(x^{2^k} \bmod 998244353\) 关于 \(k\) 有循环节的啊喂 /dk2025CSP-S第二轮(复赛)模拟赛 链接:link 题解:link 时间:4h (2025.10.25 14:30~18:30) 题目数:…

标题:AI巨头动态:从OpenAI的野心到Meta的裁员潮

标签:人工智能, 科技新闻, 就业趋势, 行业观察最近关注了一些科技新闻,发现AI领域真是风云变幻,既有像OpenAI这样的公司不断扩张,又有Meta那边传出裁员消息,让人不禁思考这个行业的发展方向。先说说OpenAI吧,他们…

Plant Com | 将基因编辑与组学、人工智能和先进农业技术相结合以提高作物产量

2025年5月28日,英国洛桑研究所(Rothamsted Research) Christophe Lambing团队于Plant Communications 在线发表了题为Integrating genome editing with omics, artificial intelligence and advanced farming techn…

Python 潮流周刊#74:创下吉尼斯世界记录的 Python 编程课

你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。周刊开源在 Github 上,喜欢请给颗小星星支持下~ 🎉 1024程序员节特惠: 10.24 - 10.31 期间,本周刊年费仅需 99 元(原价 148 元)…

10.26保养

OP291前面转角皮带 皮带目前已经有了明显的变形,说明第三方的防静电皮带寿命不佳。 先用库里面G-G25的更换,换下来的先不扔,放我桌上,等美德乐的原装皮带到货再扔。 OP120 气管更换 坦克链太小,气管和电线磨损严重…

作品目录

将在这里更新我的所有作品的目录。 文章 学习笔记暂无游记游记:GESP202406 C++ 三级(待完成) 游记:CSP-J/S2024 第一轮(待完成) 游记:CSP-J/S2024 第二轮(待完成) 游记:GESP202412 C++ 四级(待完成) 游记:…

CCPC2024济南个人题解

A.The Fool / 愚者 题意:给定 \(n\) 行、每行 \(m\) 个连续的字符串,每个字符串长度为 \(k\) ,当中有且仅有一个与其他的字符串不同,找出这个字符串,输出它所在的行和列。 限制条件: \(n,m≤200, k≤10\)。 题解…

推荐书籍 | 基因组遗传大数据分析方法

分享一本2024年由哈尔滨医科大学编写、科学出版社出版的书籍——《基因组遗传大数据分析方法》。本书围绕基因组遗传大数据分析的基本方法,首先介绍了遗传变异和表观遗传变异的基本概念,接着介绍了相关分析方法及软件…

Python 潮流周刊#124:理性看待 GIL 的移除

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 🎉 1…

【笔记】在WPF中 BulletDecorator 的功能、采用方式并对比 HeaderedContentControl 与常见 Panel 布局的区别

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

OpenAI推出内置ChatGPT的Atlas浏览器:重新定义网页浏览体验

OpenAI正式发布内置ChatGPT的Atlas浏览器,通过AI代理实现网页内容分析与任务自动化,支持多平台与开发者工具,同时引发隐私安全与数据控制的新一轮讨论。OpenAI推出内置ChatGPT的Atlas浏览器:重新定义网页浏览体验 …

数据清洗

数据清洗,像极了洗鸭肠 又臭又脏,还会让满手沾满屎的味道,鸭肠很油腻 所以一定要隔离开,尽可能在单独的区域做这件事

102302104刘璇-数据采集与融合技术实践作业1

作业1: 要求:用requests和BeautifulSoup库方法定向爬取给定网站(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。 输出信息:排名 学校名称 省市 学校类型 总分1 清华大学…

102302110高悦作业1

• 作业①:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。 1.代码与实验结果 首先打开网页,查看网页的源代码,找出并…

2025.10.23 模拟赛

前言 最抽象的一集,切 A 花了快 2h,B 最后 30 min 想到做法但没调完。 A P8102 考虑将 \(A\) 插入到 \(i(\in [0,n])\) 后对答案的贡献。 设 \(f_i\) 表示 \([\max(1,i-m+1),i]\) 的最大值,\(g_i\) 表示 \([\max(1,…

刷题日记—洛谷循环题单 1.数学思想在算法题中的应用: 2.回文数的判定:

1.数学思想在算法题中的应用: 这道题的重点在于把每周的总存储求出来,然后用X与K表示,定为W,W52=N可以求出W,由W=AX+BK,可以将K从小到大遍历,直至BK=W,求出第一个符合要求的X值即为X最大值,对应的K也为最小值.…

Day23-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\InOut

递归 递归公式 递归结束语句 package com.recursion;public class RecursionTest1 {public static void main(String[] args) {test1();}public static void test1(){System.out.println("------test1------"…

U623471 暂未定题目(无数据)

#include<bits/stdc++.h> using namespace std; mt19937_64 mrd(time(0)); const int N=1e9+7,inf=1e9,M=6e7; int pri[M],tot,fa[200010]; bool vis[N]; void init(){for(int i=2;i<=1e9;i++){if(!vis[i]) p…

深入解析:每日前端宝藏库 | tinykeys ✨

深入解析:每日前端宝藏库 | tinykeys ✨pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…