@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注解时,需要根据具体情况进行权衡和取舍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设备取电芯片LDR6328Q

2021年5月&#xff0c;USB-IF 协会发布了全新的USB PD3.1规范&#xff0c;该规范将快充功率上限从100 W提升至240W&#xff08;支持Extended Power Range&#xff0c;简称EPR&#xff09;。充电功率的提升也让USB PD的应用从手机、笔记本电脑&#xff0c;扩展到便携式设备、物联…

教育行业文件协作的最佳实践分享!

在教育工作中&#xff0c;经常需要进行文件协作&#xff0c;无论是师生间还是老师与老师之间。目前最常用的文件协作方式就是通过社交工具或者邮件进行文件共享。 这种协作方式的缺点 1、大文件传输不便&#xff1a;这种协作方式依托于社交工具&#xff0c;对于大文件传输并不…

百日筑基篇——python爬虫学习(一)

百日筑基篇——python爬虫学习&#xff08;一&#xff09; 文章目录 前言一、python爬虫介绍二、URL管理器三、所需基础模块的介绍1. requests2. BeautifulSoup1. HTML介绍2. 网页解析器 四、实操1. 代码展示2. 代码解释1. 将大文件划分为小的文件2. 获得结果页面的url3. 获取结…

opsForHash() 与 opsForValue 请问有什么区别?

&#x1f449;&#xff1a;&#x1f517;官方API参考手册 如图&#xff0c;opsForHash()返回HashOperations<K,HK,HV>但是 opsForValue()返回ValueOperations<K,V>… 区别就是opsForHash的返回值泛型中有K,HK,HV,其中K是Redis指定的某个数据库里面某一个关键字(由…

Flutter BottomSheet 三段式拖拽

BottomSheetBehavior 追踪 BottomSheet系统默认实现效果准备要实现的功能点&#xff1a;定义三段式状态&#xff1a;BottomSheetBehavoir阀值定义1. 未达到滚动阀值&#xff0c;恢复状态2. 达到滚动阀值&#xff0c;更新状态 前面倒是有讲过Android原生的BottomSheetBehavior&a…

谈谈我的感受

虽然清楚知识需要靠时间沉淀&#xff0c;但在看到自己做不出来的题别人会做&#xff0c;自己写不出的代码别人会写时还是会感到焦虑怎么办&#xff1f; 感受 当我们比别人弱的时候&#xff0c;可能会感到挫败、失落、沮丧或无力。这种感受往往是因为我们与自己设定的标准或别人…

时序预测-Informer简介

Informer介绍 1. Transformer存在的问题 Informer实质是在Transformer的基础上进行改进&#xff0c;通过修改transformer的结构&#xff0c;提高transformer的速度。那么Transformer有什么样的缺点&#xff1a; &#xff08;1&#xff09;self-attention的平方复杂度。self-…

ruoyi-cloud微服务新建子模块

目录 相关文章1、复制system模块2、在modules下的 pom.xml文件中添加子模块 test3、进入 test模块修改 pom.xml4、修改对应的包名、目录名和启动应用程序为test5、修改bootstrap.yml文件中的端口号和应用名称6、nacos中克隆 system-dev.yml的配置&#xff0c;修改名称为 test-d…

章节7:XSS检测和利用

章节7&#xff1a;XSS检测和利用 测试payload <script>alert(XSS)</script> <script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> &qu…

React Native 图片组件基础知识

在 React Native 中使用图片其实跟 HTML 中使用图片一样简单&#xff0c;在 React Native 中我们使用Image组件来呈现图片的内容&#xff0c;其中主要的属性有&#xff1a;source。这个属性主要是设置图片的内容&#xff0c;它可以是网络图像地址、静态资源、临时本地图像以及本…

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB

本课程基于百度地图技术&#xff0c;由基础入门开始到应用实战&#xff0c;适合零基础入门学习。将企业项目中地图相关常见应用场景的落地实战&#xff0c;包括有地图找房、轻骑小程序、金运物流等。同时讲了基于Netty实现高性能的web服务&#xff0c;来处理高并发的问题。还讲…

ElasticSearch单节点部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

差分升级在物联网水表上的实现与应用(学习)

摘要 当越来越多的物联网水表加入抄表系统后&#xff0c;实现了水表数据的信息化&#xff0c;并且当水表终端需要技术更新时&#xff0c;通过网络方式来升级产品可以高效修复设备面临的问题&#xff0c;减少用户损失&#xff0c;降低维护成本&#xff0c;但同时也对有限的网络…

Python Opencv实践 - 图像旋转

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像旋转 #Opencv中的旋转&#xff0c;首先通过cv.getRotationMatrix2D获得旋转矩阵 #cv.getRotationMatrix2D(center,ang…

navicat连接postgresql报错

navicat连接postgresql报错 navicat连接postgresql报错 现象 有小伙伴告诉我 安装了新的postgresql 使用navicat连接&#xff0c;报错 ERROR: column "datlastsysoid" does not existLINE 1: SELECT DISTINCT datlastsysoid FROM pg database column “datlastsy…

supervisor因为依赖安装失败的解决方法

安装FEATA时报错情况 下列软件包有未满足的依赖关系&#xff1a;supervisor : 依赖: python-pkg-resources 但是它将不会被安装依赖: python-meld3 但是它将不会被安装依赖: python:any (< 2.8)依赖: python:any (> 2.7.5-5~) E: 无法修正错误&#xff0c;因为您要求某些…

【Tomcat】(Tomcat 下载Tomcat 启动Tomcat 简单部署 基于Tomcat进行网站后端开发)

文章目录 Tomcat下载Tomcat启动Tomcat简单部署 基于Tomcat进行网站后端开发 Tomcat Tomcat 是一个 HTTP 服务器.HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. HTTP 服务器我们可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实现的一个开源免费,也是…

【C++ 学习 ⑬】- 详解 list 容器

目录 一、list 容器的基本介绍 二、list 容器的成员函数 2.1 - 迭代器 2.2 - 修改操作 三、list 的模拟实现 3.1 - list.h 3.2 - 详解 list 容器的迭代器 3.2 - test.cpp 一、list 容器的基本介绍 list 容器以类模板 list<T>&#xff08;T 为存储元素的类型&…

RabbitMQ工作流程详解

1 生产者发送消息的流程 (1)生产者连接RabbitMQ&#xff0c;建立TCP连接(Connection)&#xff0c;开启信道(Channel) (2)生产者声明一个Exchange (交换器)&#xff0c;并设置相关属性&#xff0c;比如交换器类型、是否持久化等 (3)生产者声明一个队列井设置相关属性&#xf…