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

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

相关文章:

@Param详解

文章目录 背景什么是ParamParam的使用方法使用方法&#xff1a;遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景 最近在开发过程中&#xff0c;在写mapper接口是在参数前加了Param注解&#xff0c;但是在运行的时候就会报错&#xff0c;说…...

自定义分页工具类

前言 在日常的开发工作中&#xff0c;会遇到很多不确定的需求场景&#xff0c;无法使用第三方提供的分页组件来实现&#xff0c;那么如何自己实现一个简单的分页工具类呢&#xff1f; 工具类 第一版本&#xff1a; Setter Getter public class PageTool<T> {/*** 当前…...

文本数据保存

文本数据保存 工具目的代码运行结果 工具 pycharm 目的 网址:https://ljgk.envsc.cn/ 需求&#xff1a;获取到地址&#xff08;address&#xff09;&#xff0c;公司名字&#xff08;ps_name&#xff09;&#xff0c;创建的时间&#xff08;create_time&#xff09;&#xff…...

Python爬虫:抓取表情包的下载链接

Python爬虫:抓取表情包的下载链接 1. 前言2. 具体实现3. 实现代码 1. 前言 最近发现了一个提供表情包的网址&#xff0c;觉得上面的内容不错&#xff0c;于是就考虑用Python爬虫获取上面表情包的下载链接。整体而言&#xff0c;实现这个挺简单的&#xff0c;就是找到提供表情包…...

(文章复现)基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码

参考文献&#xff1a; [1]高瑜,黄森,陈刘鑫等.基于改进灰狼算法的并网交流微电网经济优化调度[J].科学技术与工程, 2020,20(28):11605-11611. [2]邓长征,冯朕,邱立等.基于混沌灰狼算法的交直流混合微网经济调度[J].电测与仪表, 2020, 57(04):99-107. 这两篇文章不管是从模型、…...

【Kubernetes】Kubernetes的调度

K8S调度 一、Kubernetes 调度1. Pod 调度介绍2. Pod 启动创建过程3. Kubernetes 的调度过程3.1 调度需要考虑的问题3.2 具体调度过程 二、影响kubernetes调度的因素1. nodeName2. nodeSelector3. 亲和性3.1 三种亲和性的区别3.2 键值运算关系3.3 节点亲和性3.4 Pod 亲和性3.5 P…...

题目:2511.最多可以摧毁的敌人城堡数量

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2511. 最多可以摧毁的敌人城堡数目 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 顺序遍历数组&#xff0c;记录上一个我军城堡和没有城堡的位置。当碰到空位置时&#xff0c;若上一次更新的…...

22 | 书籍推荐数据分析

import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn import neighbors from sklearn.model_selection import train_test_split from sklearn.preprocessing import...

vscode extension 怎么区分dev prod

开发模式注入环境变量 使用vsode 提供的api...

Java学习手册——第一篇Java简介

今后Java学习手册就来给大家梳理JavaSE的基础知识啦&#xff0c; 除了这个专栏我们还有其他专栏&#xff1a;前端、安全、后端等。 希望大家可以在这里一起讨论学习哟~ Java学习手册——第一篇Java简介 1. Java基础知识2. Java能干嘛3. Java基础环境搭建 1. Java基础知识 出生…...

Prometheus流程图(自绘)-核心组件-流程详解

阿丹手绘流程图&#xff1a;图片可能有点小查看的时候放大看看哈&#xff01; prometheus核心组件 prometheus server Prometheus Server是Prometheus组件中的核心部分&#xff0c;负责实现对监控数据的获取&#xff0c;存储以及查询。Prometheus Server可以通过静态配置管理…...

回归模型常见评估指标mae,mse,rmse

文章目录 MAE(平均绝对误差)计算公式sklearn实现numpy实现mse(均方误差)计算公式sklearn实现numpy实现rmse(均方根误差)计算公式sklearn实现MAE(平均绝对误差) 计算公式 MAE ⁡ ( y ,...

服务器数据恢复-断电导致ext4文件系统文件丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器挂载一台存储设备&#xff0c;存储中划分一个Lun&#xff1b;服务器操作系统是Linux centos&#xff0c;EXT4文件系统。 服务器故障&分析&#xff1a; 意外断电导致服务器操作系统无法启动&#xff0c;系统在修复后可以正常启动&…...

链表(基础详解、实现、OJ笔试题)

文章目录 &#x1f9da;什么是链表&#xff08;链表概念及分类&#xff09;链表分类单链表和双链表的区别 &#x1f6b4;‍♂️单链表、双向链表的实现单链表的实现双向链表的实现 &#x1f349;链表经典OJ笔试题反转单链表移除链表元素合并两个有序链表链表分割链表的中间结点…...

W5100S-EVB-PICO作为TCP Client 进行数据回环测试(五)

前言 上一章我们用W5100S-EVB-PICO开发板通过DNS解析www.baidu.com&#xff08;百度域名&#xff09;成功得到其IP地址&#xff0c;那么本章我们将用我们的开发板作为客户端去连接服务器&#xff0c;并做数据回环测试&#xff1a;收到服务器发送的数据&#xff0c;并回传给服务…...

大数据-玩转数据-Redis 安装与使用

一、说明 大多数企业都是基于Linux服务器来部署项目&#xff0c;而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址&#xff1a;http://download.redis.io/releases 二、下载 m…...

实时指标-1日留存率

2个DWD层 登录→kafka注册→kafka1个DWS 弄2条流&#xff0c;从kafka读取数据将昨日注册数据存到状态中&#xff0c;TTL为2天&#xff0c;存到map状态中&#xff0c;key为注册日期&#xff0c;value为set&#xff0c;存储注册的uid将登录流和注册流进行连接来一条登录数据&…...

【玩转23种Java设计模式】行为型模式篇:责任链模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...

【C#】获取电脑CPU、内存、屏幕、磁盘等信息

通过WMI类来获取电脑各种信息&#xff0c;参考文章&#xff1a;WMI_04_常见的WMI类的属性_wmi scsilogicalunit_fantongl的博客-CSDN博客 自己整理了获取电脑CPU、内存、屏幕、磁盘等信息的代码 #region 系统信息/// <summary>/// 电脑信息/// </summary>public p…...

途乐证券-最准确的KDJ改良指标?

KDJ目标是技术剖析的一种重要目标之一&#xff0c;它是利用随机目标&#xff08;%R&#xff09;发展而来的&#xff0c;是一种反映商场超买和超卖状况的买卖目标。KDJ目标由快线&#xff08;K线&#xff09;、慢线&#xff08;D线&#xff09;和随机值&#xff08;J线&#xff…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目

应用场景&#xff1a; 1、常规某个机器被钓鱼后门攻击后&#xff0c;我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后&#xff0c;我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...