使用MyBatis框架时Mapper传参是否需要使用@Param注解

news/2025/2/23 20:11:21/文章来源:https://www.cnblogs.com/nuccch/p/18732731

在使用MyBatis作为Java项目的ORM框架时,在Mapper接口中传递参数需要通过@Param注解指定参数名称,这样才能在Mapper接口对应的xml文件中引用到对应名称的参数。如果不在Mapper接口中明确使用@Param注解时将会报错:找不到指定名称的参数
追根溯源,这要从MyBatis获取Mapper接口参数名的实现说起,如下源码:

// ParamNameResolver.java
// 在ParamNameResolver构造函数中获取Mapper接口参数的实现思路如下:
// 1.如果参数使用注解@Param,则取注解值作为参数名;
// 2.如果参数未使用注解@Param,就尝试通过反射方式获取Mapper接口的参数名;
// 3.如果在第2步仍然未获取到参数名,则使用参数索引值(如:0,1,2....)作为参数名;
public ParamNameResolver(Configuration config, Method method) {this.useActualParamName = config.isUseActualParamName();final Class<?>[] paramTypes = method.getParameterTypes();final Annotation[][] paramAnnotations = method.getParameterAnnotations();final SortedMap<Integer, String> map = new TreeMap<>();int paramCount = paramAnnotations.length;// get names from @Param annotationsfor (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {if (isSpecialParameter(paramTypes[paramIndex])) {// skip special parameterscontinue;}String name = null;for (Annotation annotation : paramAnnotations[paramIndex]) {if (annotation instanceof Param) {hasParamAnnotation = true;name = ((Param) annotation).value();break;}}if (name == null) {// @Param was not specified.if (useActualParamName) {name = getActualParamName(method, paramIndex);}if (name == null) {// use the parameter index as the name ("0", "1", ...)// gcode issue #71name = String.valueOf(map.size());}}map.put(paramIndex, name);}names = Collections.unmodifiableSortedMap(map);
}// 通过注解方式获取Mapper参数名
private String getActualParamName(Method method, int paramIndex) {return ParamNameUtil.getParamNames(method).get(paramIndex);
}// ParamNameUtil.java
public class ParamNameUtil {public static List<String> getParamNames(Method method) {return getParameterNames(method);}public static List<String> getParamNames(Constructor<?> constructor) {return getParameterNames(constructor);}// 这里依赖Java编译器在编译代码时是否保留了参数的实际名称,如果未保留参数实际名称则返回nullprivate static List<String> getParameterNames(Executable executable) {return Arrays.stream(executable.getParameters()).map(Parameter::getName).collect(Collectors.toList());}private ParamNameUtil() {super();}
}

综上所述,在MyBatis框架的Mapper接口中是否需要使用注解@Param明确指定参数名称,依赖Java编译器在编译代码时是否保留了方法参数的实际名称。

那么问题就转变成了:Java编译器在什么时候会保留方法参数的实际名称呢?依赖2个条件:
1.JDK版本必须是8及以上,参见:java8中新增编译参数parameters入门,jdk1.8 开启-parameters参数,编译保留参数名,为反射提供便利。
2.在Maven插件maven-compiler-plugin中明确设置编译参数,根据插件版本不同,设置编译参数的方式各异,如下:

  • 版本3.6.2之前
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.0</version><configuration><!-- 添加编译JDK8+支持的编译参数-parameters,保留方法参数名称 --><compilerArgs>-parameters</compilerArgs></configuration>
</plugin>
  • 版本3.6.2及之后
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.0</version><configuration><!-- 添加编译JDK8+支持的编译参数-parameters,保留方法参数名称 --><parameters>true</parameters></configuration>
</plugin>

当然,在IDEA中运行代码时,如果没有明确配置maven-compiler-plugin插件的编译参数,还可以设置项目模块的编译参数,如下:

【参考】
MyBatis多参数传递之@Param究竟加还是不加?
关于Mybatis的@Param注解
Mybatis省略@Param注解原理

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

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

相关文章

关于在阿里云服务器上搭建简单的keepalived主备服务器时出现的问题

问题:在进行keepalived主备服务器配置时,仅配置了RID,状态,通讯端口,VRID,优先级,通告报文发送时间,密码认证部分,VIP。在启动服务时,发现两台设备均跳转状态为MASTER。原因:出现这问题的场景是在阿里VPS云服务器网络环境中,因为路由交换层禁用了ARP的广播限制,造…

子串分值

‌输入和初始化‌: 读取字符串 str,并从索引 1 开始存储(C++ 中字符串索引从 0 开始,但这里为了简化计算,从 1 开始)。 n 存储字符串的长度。 数组 l[i] 存储字符 str[i] 上一次出现的位置。 数组 r[i] 存储字符 str[i] 下一次出现的位置。 数组 p 用于临时存储每个字符最…

【专题】2024年新能源汽车市场年度竞争报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p=39740 在当下快速变革的时代,新能源汽车市场正处于关键的发展十字路口。过去几年间,市场经历了一系列深刻的结构性调整,从市场份额的重新分配到消费者行为模式的显著转变,每一个变化都蕴含着巨大的市场信号。深入分析这些变化背后的数据逻…

pikachu靶场搭建教程

详细介绍了pikachu靶场的搭建,并且附有安装包需要的东西phpStudy: 链接: https://pan.baidu.com/s/1fJ-5TNtdDZGUf5FhTm245g 提取码:0278 pikachu-master: Github链接:Github 链接 链接: https://pan.baidu.com/s/1lDdlxNaa3YjhIEj-WWB3qw 提取码:0278打开 phpstudy ,…

2.17周报

一、本周内容总结本周主要进行了蓝桥和天梯的训练,训练了3场蓝桥、2场天梯,剩余时间的就是赛后补题 补题的过程也重新理清了很多知识,包括gcd和lcm的应用,多项式除法的过程等等 对于蓝桥和天梯的赛制,还重新背了下很多算法的板子,包括求最短路的多种方法,不同范围求组合…

来点树链剖分

树链剖分树链剖分学习笔记 引入 给你一棵树,先单点加,再路径求和,你觉得很简单,用树上差分解决了这个问题。 再给你一棵树,先路径加,再单点查询,你觉得很简单,用树上差分解决了这个问题。 又给你一棵树,上述操作都有,而且顺序不分先后,你发现树上差分不能解决这个问…

《轻松上手:LangChain 的安装与验证全流程》

在当今快速发展的技术领域,掌握新工具是提升工作效率的关键。今天,我将为大家详细介绍如何轻松安装 LangChain,并验证其是否成功安装,让你迅速开启探索这一强大工具的旅程。 首先,在命令行中运行以下命令来安装 LangChain: pip install langchain安装完成后,为了确保一切…

双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换

双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换 题目背景 本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水,各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考。 本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容 题目描述 已知有两…

uniapp uview u-form表单校验:表单有值却校验不通过的问题

<u-form-item label="数量" required prop="num"><u-input v-model="form.num"></u-input> </u-form-item>检查校验不通过的字段值类型是什么,如果是非string类型,要在rules上指定值类型。原因:u-form的校验规则是值…

BUS设计中的DeadLock死锁问题

本文讨论一下 BUS 设计中的 DeadLock 死锁问题,或者叫做 Cyclic Dependency 循环依赖问题。其含义是指 A 的动作导致 B 的动作无法进行下去,同样 B 的动作导致 A 的动作无法进行下去,二者相互依赖,形成死锁。 1 AXI握手死锁 在学习 AXI 协议时,手册中提到了 AXI 握手死锁,…

字符串-str

字符串-str 1.1 特点需要加上引号,单引号与双引号都可以,包含了多行内容的时候还可以用三引号name = rock #报错,没有引号识别为变量名, name = "rock" print(name) name = kyle print(name) name = """rock #多行内容时使用三引号,区分三引…

X00221-基于多智能体强化学习的车联网频谱共享python完整代码

研究基于多智能体强化学习的车联网频谱共享问题,其中多个车与车(V2V)链路复用由车与基础设施(V2I)链路占用的频谱。由于高速移动的车联网环境中信道变化快速,导致基站无法收集到准确的瞬时信道状态信息,从而无法进行集中式资源管理。对此,将资源共享建模为一个多智能体…