@Param详解

文章目录

  • 背景
  • 什么是@Param
    • @Param的使用方法使用方法:
    • 遇到的问题及因
    • @Param解决了什么问题
    • 使用与不使用对比
  • @Param是如何进行映射的
  • 总结

背景

最近在开发过程中,在写mapper接口是在参数前加了@Param注解,但是在运行的时候就会报错,说是找不到参数、
nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘defaultRole’ not found. Available parameters are [role, param1]
在这里插入图片描述

什么是@Param

@Param注解是一种用于标记方法参数的注解,它用于指定该参数的名称和类型,在使用该参数时可以通过名称来引用。在不同的编程语言和框架中,@Param注解的具体用法和功能可能会有所不同。

在Java开发中,如果用到了mybatis,那么@Param是用户给方法参数指定一个名称,以便在Mapper XML文件中引用该参数。

@Param的使用方法使用方法:

当使用MyBatis框架时,@Param注解有以下几种使用方法:

1、在Mapper接口方法的参数前使用@Param注解指定参数名称:

void insertUser(@Param("user") User user);

在Mapper XML文件中可以使用#{user}来引用参数。

2、在Mapper接口方法的参数前使用@Param注解指定多个参数名称:

void insertUserAndRole(@Param("user") User user, @Param("role") Role role);

在Mapper XML文件中可以使用#{user}和#{role}来引用参数。

3、在Mapper接口方法的参数前使用@Param注解指定相同的参数名称:

void insertUsers(@Param("users") List<User> users);

在Mapper XML文件中可以使用#{users}来引用参数。

4、在Mapper接口方法的参数前使用@Param注解指定多个相同的参数名称:

void insertUserAndRoles(@Param("users") List<User> users, @Param("roles") List<Role> roles);

在Mapper XML文件中可以使用#{users}和#{roles}来引用参数。

5、在Mapper接口方法的参数前不使用@Param注解:

void insertUser(User user);

在Mapper XML文件中可以使用#{arg0}来引用参数,或者把#{arg0}替换为#{user}

6、在Mapper接口方法的参数前不使用@Param注解,但有多个参数:

void insertUserAndRole(User user, Role role);

在Mapper XML文件中可以使用#{arg0}和#{arg1}来引用参数。

这些是@Param注解的常见使用方法。通过使用@Param注解,可以明确指定Mapper接口方法参数的名称,使得在Mapper XML文件中引用参数更加直观和可读。

原理:
@Param注解的作用是给Mapper接口方法的参数命名,以便在Mapper XML文件中引用这些参数。没有@Param注解时,MyBatis无法识别参数的名称,导致无法正确引用参数。
在编译时,Java编译器会将@Param注解保留在编译后的字节码文件中。MyBatis通过Java的反射机制获取Mapper接口方法的参数列表,并检查是否存在@Param注解。
当解析Mapper XML文件时,MyBatis会根据#{}占位符中的名称来查找对应的参数。如果找不到与占位符名称匹配的参数,MyBatis会抛出BindingException异常。

遇到的问题及因

这是我写的mapper接口:

 int setDefaultRole( List<SysRole> roleList);

以及xml文件:

<update id="setDefaultRole" >update sys_role<set><foreach collection="roleList" item="role" separator=",">default_role=#{role.defaultRole},update_by=#{role.updateBy},update_time=sysdate()</foreach></set>where role_id in<foreach collection="roleList" item="role" open="(" close=")" separator=",">#{role.roleId}</foreach>and del_flag=0</update>

那么在xml文件中用到了多个关于roleList的多个参数,所以这里如果不使用@Param注解是不可以,他不能对应上对应的参数
这个错误通常是由于Mapper接口方法的参数和Mapper XML文件中的参数名不一致导致的。

@Param解决了什么问题

@Param注解主要解决了以下两个问题:

解决多个参数的问题: 在Mapper接口方法中,如果存在多个参数,MyBatis默认会将这些参数封装为一个Map对象,并以参数名作为键,参数值作为值。但是,当需要在Mapper XML文件中引用这些参数时,就需要使用#{}占位符,并指定对应的参数名。而@Param注解可以明确指定参数的名称,使得在Mapper XML文件中引用参数更加直观和可读。

解决参数名与Mapper XML文件中占位符名称不一致的问题: 在Mapper XML文件中,使用#{}占位符来引用参数,占位符中的名称应该与Java代码中的参数名称一致。但是,Java编译器在编译时会将参数名擦除,导致在运行时无法获取参数的名称。而@Param注解可以保留参数的名称,并在运行时通过反射机制获取参数的名称,从而确保参数名与占位符名称一致。

通过使用@Param注解,可以提高Mapper接口方法的可读性和可维护性,避免了潜在的错误。它确保了Mapper XML文件中的参数引用与Java代码中的参数名称一致。

使用与不使用对比

使用@Param注解和不使用的区别主要体现在Mapper接口方法的参数映射上。

不使用@Param注解:
void insertUser(User user);
在Mapper接口方法中,直接使用参数对象作为方法的参数,例如User user。在Mapper XML文件中,可以使用#{}占位符来引用参数的属性,例如#{id}和#{name}。

使用@Param注解:
void insertUser(@Param(“user”) User user);
在Mapper接口方法中,使用@Param注解来明确指定参数的名称,例如@Param(“user”)。在Mapper XML文件中,可以使用#{}占位符来引用参数,占位符中的名称应与@Param注解中指定的名称一致,例如#{user.id}和#{user.name}。

使用@Param注解的优势是可以提高Mapper接口方法的可读性和可维护性。通过明确指定参数的名称,可以确保参数名与占位符名称一致,避免因为参数顺序变化或者重载方法导致的错误。

总结起来,使用@Param注解可以提高Mapper接口方法的可读性和可维护性,确保参数名与占位符名称一致,而不使用@Param注解则直接使用参数对象作为方法的参数。

@Param是如何进行映射的

当使用@Param注解时,MyBatis会通过反射机制获取Mapper接口方法的参数信息,包括参数的名称和类型。然后,MyBatis会将这些参数信息与方法的参数列表进行关联,以便后续在Mapper XML文件中引用这些参数。

具体的映射过程如下:

在Mapper接口方法上使用@Param注解,并指定参数的名称。例如:

void insertUser(@Param("user") User user);

这里使用@Param(“user”)注解明确指定了参数的名称为"user"。

MyBatis解析Mapper接口方法时,会通过反射获取方法的参数信息,包括参数的名称和类型。这是通过Java的反射机制实现的。

在解析Mapper XML文件时,MyBatis会使用ParamNameResolver类来解析占位符中的参数名称。ParamNameResolver会根据方法的参数列表和参数名称,确定参数的映射关系。

在Mapper XML文件中,可以使用#{}占位符来引用参数。占位符中的名称应与Java代码中的参数名称一致。例如:

<insert id="insertUser" parameterType="com.example.User">INSERT INTO user (id, name) VALUES (#{user.id}, #{user.name})
</insert>

这里使用#{user.id}和#{user.name}来引用参数。

通过以上过程,@Param注解实现了参数名称与Mapper XML文件中占位符名称的映射关系。这样可以提高Mapper接口方法的可读性和可维护性,确保参数名与占位符名称一致。

总的来说,@Param注解的工作原理是通过反射机制获取参数信息,并将参数名称与方法的参数列表进行关联,以确保参数名与占位符名称一致。这样可以提高Mapper接口方法的可读性和可维护性。

总结

总结起来,@Param注解用于在Mapper接口方法中明确指定参数的名称,以提高方法的可读性和可维护性。以下是关于@Param注解的优缺点的总结:

优点:

明确参数名称:使用@Param注解可以明确指定参数的名称,避免参数顺序变化或者重载方法导致的错误。这样可以提高代码的可读性和可维护性。
参数与占位符一致:@Param注解可以确保参数名与Mapper XML文件中的占位符名称一致,避免因为参数名与占位符不一致而引发的错误。
缺点:

冗余代码:使用@Param注解会在Mapper接口方法中增加注解的代码,可能会导致代码的冗余。
额外的注解:使用@Param注解需要在Mapper接口方法中添加额外的注解,可能会增加代码的复杂性。
@Param注解可以提高Mapper接口方法的可读性和可维护性,确保参数名与占位符名称一致。然而,使用@Param注解可能会导致代码的冗余,同时也需要额外的注解。因此,在使用@Param注解时,需要根据具体情况进行权衡和取舍。

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

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

相关文章

更多openEuler镜像加入AWS Marketplace!

自2023年7月openEuler 22.03 LTS SP1正式登陆AWS Marketplace后&#xff0c;openEuler社区一直持续于在AWS上提供更多版本。 目前&#xff0c;openEuler22.03 LTS SP1 ,SP2两个版本及 x86 arm64两种架构的四个镜像均可通过AWS对外提供&#xff0c;且在亚太及欧洲15个Region开放…

wkhtmltopdf 与 .Net Core

wkhtmltopdf 是使用webkit引擎转化为pdf的开源小插件. 其有.NET CORE版本的组件,DinkToPdf,但该控件对跨平台支持有限。 故打算在Linux上安装相关插件直接调用. 准备工作 虚拟机&#xff1a;Linux version 3.10.0-1160.el7.x86_64 wkhtmltox开发包&#xff1a;wkhtmltox_0.12…

大数据Flink(六十):Flink 数据流和分层 API介绍

文章目录 Flink 数据流和分层 API介绍 一、​​​​​​​​​​​​​​Flink 数据流

ZooKeeper的应用场景(命名服务、分布式协调通知)

3 命名服务 命名服务(NameService)也是分布式系统中比较常见的一类场景&#xff0c;在《Java网络高级编程》一书中提到&#xff0c;命名服务是分布式系统最基本的公共服务之一。在分布式系统中&#xff0c;被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等一这…

iOS申请证书(.p12)和描述文件(.mobileprovision)

打包app时&#xff0c;经常会用到ios证书&#xff0c;但很多人都苦于没有苹果电脑&#xff0c;即使有苹果电脑的&#xff0c;也会觉得苹果电脑操作也很麻烦&#xff0c;这里记录一下&#xff0c;用香蕉云编&#xff0c;申请证书及描述文件的过程。 香蕉云编的地址&#xff1a;…

【C语言】每日一题(多数元素)

多数元素&#xff0c;链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票&#xff1a; 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢&#xff1f; 在一个集合中&#xff0c;如果一个元素…

每天一练:SpringBoot连接mq

目录 每天一练:Springboot连接rabbitmq 每天一练:Springboot连接rabbitmq 目录一、部署Rabbitmq&#xff1f;二、增加maven依赖三、连接RabbitMq四、发布和订阅消息总结 一、部署Rabbitmq&#xff1f; 这里rabbitmq采用docker安装部署。 拉取docker镜像 [root192 ~]# docker…

【ChatGLM】ChatGLM-6B模型Win+4GB显卡本地部署笔记

ChatGLM-6B是清华大学知识工程和数据挖掘小组发布的一个类似ChatGPT的开源对话机器人&#xff0c;由于该模型是经过约1T标识符的中英文训练&#xff0c;且大部分都是中文&#xff0c;因此十分适合国内使用。 预期环境 本机电脑备注&#xff1a; Win10专业版 32G内存256固态系统…

SAP动态安全库存简介

动态安全库存:跑需求计划时,ERP系统按设置的库存方式自动计算出满足一定时间内可保障生产的库存数量 SAP动态安全库存的计算公式:动态安全库存=平均日需求*覆盖范围。 平均日需求=特定时期内的总需求/特定时期内的工作天数 覆盖范围指在没又货物供应的情况下,库存可以维…

稀疏感知图像和体数据恢复的系统对象研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32 F103C8T6学习笔记6:IIC通信__驱动MPU6050 6轴运动处理组件—一阶互补滤波

今日主要学习一款倾角传感器——MPU6050,往后对单片机原理基础讲的会比较少&#xff0c;更倾向于简单粗暴地贴代码&#xff0c;因为经过前些日子对MSP432的学习&#xff0c;对原理方面也有些熟络了&#xff0c;除了在新接触它时会对其引脚、时钟、总线等进行仔细一些的研究之外…

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢复PMCR_EL0可能会泄露安全世界的时间信息 CVE ID CVE-2017-1503…

spark的standalone 分布式搭建

一、环境准备 集群环境hadoop11&#xff0c;hadoop12 &#xff0c;hadoop13 安装 zookeeper 和 HDFS 1、启动zookeeper -- 启动zookeeper(11,12,13都需要启动) xcall.sh zkServer.sh start -- 或者 zk.sh start -- xcall.sh 和zk.sh都是自己写的脚本-- 查看进程 jps -- 有…

星星之火:国产讯飞星火大模型的实际使用体验(与GPT对比)

#AIGC技术内容创作征文&#xff5c;全网寻找AI创作者&#xff0c;快来释放你的创作潜能吧&#xff01;# 文章目录 1 前言2 测试详情2.1 文案写作2.2 知识写作2.3 阅读理解2.4 语意测试&#xff08;重点关注&#xff09;2.5 常识性测试&#xff08;重点关注&#xff09;2.6 代码…

常识判断

头像 carrin&#xff5e;&#x1f47b; 产品经理 225/753 75/302.5 30/152 15/101.5 等差数列&#xff0c;所以最后一个是10/101 收起 60 回复 发布于 2020-02-18 16:33

Mysql之explain详解

1. explain作用 使用explain可以展示出sql语句的执行计划&#xff0c;再根据sql的执行计划去判断这条sql有哪些点可以进行优化&#xff0c;从而让sql的效率达到最大化。 2. 执行计划各列含义 &#xff08;1&#xff09;id&#xff1a;id列是select的序列号&#xff0c;这个…

React18TS项目:配置react-css-modules,使用styleName

他的好处不说了 网上一堆文章一个能打的都没有&#xff0c; 添加开发依赖 pnpm add -D dr.pogodin/babel-plugin-react-css-modules types/react-css-modules Babel Plugin "React CSS Modules" | Dr. Pogodin Studio 看dr.pogodin/babel-plugin-react-css-mo…

centos7安装erlang及rabbitMQ

下载前注意事项&#xff1a; 第一&#xff1a;自己的系统版本&#xff0c;centos中uname -a指令可以查看&#xff0c;el8&#xff0c;el7&#xff0c;rabbitMQ的包不一样&#xff01; 第二&#xff1a;根据rabbitMQ中erlang version找到想要下载rabbitMQ对应erlang版本&#x…

C++储备

一、类的 三大特性 封装&#xff0c;继承&#xff0c;多态 二、虚函数 为啥要用到虚函数 C虚函数详解_Whitesad_的博客-CSDN博客 三、函数重载 四、封装的保护权限 1.public 成员类内&#xff0c;内外都可以访问 2.protected 成员&#xff0c;类内可以访问&#xff0c…

SElinux 导致 Keepalived 检测脚本无法执行

哈喽大家好&#xff0c;我是咸鱼 今天我们来看一个关于 Keepalived 检测脚本无法执行的问题 一位粉丝后台私信我&#xff0c;说他部署的 keepalived 集群 vrrp_script 模块中的脚本执行失败了&#xff0c;但是手动执行这个脚本却没有任何问题 这个问题也是咸鱼第一次遇到&…