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

MyBatis @Param 注解详解:多参数传递与正确使用方式

@Param 注解主要用于 MyBatis 进行参数传递时给 SQL 语句中的参数 起别名,通常用于 多参数 方法,使参数在 XML Mapper 文件或注解 SQL 语句中更清晰易用。


1. 基本用法

@Mapper 接口中使用 @Param 来为参数命名,避免 MyBatis 解析时出现参数名丢失的问题(尤其是多个参数时)。

示例:查询用户

@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{userId}")User findUserById(@Param("userId") Long id);
}

解释

  • @Param("userId") 给方法参数 id 取别名 userId
  • SQL 语句 #{userId} 通过 MyBatis 解析参数值。

2. 多参数使用 @Param

如果方法有 多个参数,MyBatis 默认无法识别参数名,必须使用 @Param 指定。

示例:根据用户名和邮箱查询用户

@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE username = #{username} AND email = #{email}")User findByUsernameAndEmail(@Param("username") String username, @Param("email") String email);
}

相当于 SQL

SELECT * FROM users WHERE username = 'Tom' AND email = 'tom@example.com';

3. @Param 在 XML 中使用

如果使用 XML 方式编写 SQL,同样需要 @Param 进行参数映射。

示例:XML 配置

Mapper 接口

@Mapper
public interface UserMapper {User findUserByName(@Param("name") String name);
}

UserMapper.xml

<select id="findUserByName" parameterType="string" resultType="User">SELECT * FROM users WHERE username = #{name}
</select>

#{name} 对应 @Param("name"),MyBatis 能正确解析参数。


4. 适用于 INSERTUPDATEDELETE

示例:更新用户信息

@Update("UPDATE users SET email = #{email} WHERE username = #{username}")
void updateUserEmail(@Param("username") String username, @Param("email") String email);

调用:

userMapper.updateUserEmail("Tom", "newemail@example.com");

执行的 SQL:

UPDATE users SET email = 'newemail@example.com' WHERE username = 'Tom';

5. 适用于 IN 查询(列表参数)

如果 SQL 需要 IN 语句,@Param 也可以用于传递 List

示例:批量查询用户

@Select("<script>SELECT * FROM users WHERE id IN " +"<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>" +"</script>")
List<User> findUsersByIds(@Param("ids") List<Long> ids);

调用:

List<Long> userIds = Arrays.asList(1L, 2L, 3L);
List<User> users = userMapper.findUsersByIds(userIds);

执行的 SQL:

SELECT * FROM users WHERE id IN (1, 2, 3);

6. 适用于 Map 作为参数

如果方法参数是 Map@Param 可以简化参数获取。

示例:传递 Map 查询

@Select("SELECT * FROM users WHERE username = #{param.username} AND email = #{param.email}")
User findByMap(@Param("param") Map<String, Object> param);

调用:

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "Tom");
paramMap.put("email", "tom@example.com");User user = userMapper.findByMap(paramMap);

执行的 SQL:

SELECT * FROM users WHERE username = 'Tom' AND email = 'tom@example.com';

7. 适用于对象参数(拆分对象字段)

如果参数是对象,可以直接使用 #{对象.字段} 访问属性,但 @Param 仍然可用于 明确参数名称

示例:传递 User 对象

@Insert("INSERT INTO users(username, email) VALUES(#{user.username}, #{user.email})")
void insertUser(@Param("user") User user);

调用:

User user = new User("Alice", "alice@example.com");
userMapper.insertUser(user);

执行的 SQL:

INSERT INTO users(username, email) VALUES('Alice', 'alice@example.com');

总结

用法示例适用场景
单个参数@Param("userId") Long id传递单个参数,避免 SQL 中参数混乱
多个参数@Param("username") String name, @Param("email") String email传递多个参数,保证 SQL 解析正确
XML 方式#{name} 对应 @Param("name")XML 中映射参数
列表参数@Param("ids") List<Long> idsIN 查询
Map 参数@Param("param") Map<String, Object>传递多个参数,简化方法参数列表
对象参数@Param("user") User user直接使用对象字段

什么时候必须用 @Param

必须用 @Param 的情况

  1. 多个参数,否则 MyBatis 可能无法正确解析
  2. SQL 中参数命名和方法参数不同
  3. XML 方式,参数需要手动映射
  4. List/Map 参数,用于 IN 查询或动态 SQL

不需要 @Param 的情况

  • 只有 一个参数 时,可以直接使用 #{参数名}
  • 参数是 对象,可以直接 #{对象.字段} 访问

💡 总结
@Param 主要用于 多参数方法,保证 MyBatis 正确解析 SQL 参数,提高可读性和维护性。

相关文章:

MyBatis @Param 注解详解:多参数传递与正确使用方式

Param 注解主要用于 MyBatis 进行参数传递时给 SQL 语句中的参数 起别名&#xff0c;通常用于 多参数 方法&#xff0c;使参数在 XML Mapper 文件或注解 SQL 语句中更清晰易用。 1. 基本用法 在 Mapper 接口中使用 Param 来为参数命名&#xff0c;避免 MyBatis 解析时出现参数…...

Spring实战spring-ai运行

目录 1. 配置 2 .搭建项目 3. 查看对应依赖 3.1 OpenAI 依赖 3.2 配置 OpenAI API 密钥 application.properties application.yml 4. openai实战 5. 运行和测试 6. 高级配置 示例&#xff1a;配置模型和参数 解释&#xff1a; 7. 处理异常和错误 示例&#xff1a;…...

STL:C++的超级工具箱(一)

书接上回&#xff0c;内存管理和指针&#xff1a;C的双刃手术刀&#xff08;一&#xff09;-CSDN博客&#xff0c;在上篇我们聊到了什么是内存&#xff0c;堆栈&#xff0c;内存管理和智能指针相关的内容&#xff0c;接下来让我们一起去看看STL是什么吧。 第一步&#xff1a;提…...

leetcode349 两个数组的交集

求两个数组的交集&#xff0c;直白点儿就是【nums2 的元素是否在 nums1 中】。 在一堆数中查找一个数&#xff0c;当然是扔出哈希。碰到这种对目前来说是未知数值大小的情况&#xff0c;我们可以使用集合 set 来解决。 使用数组来做哈希的题目&#xff0c;是因为题目都限制了数…...

快速生成viso流程图图片形式

我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制&#xff0c;viso这个软件大部分技术人员都会使用&#xff0c;但是想要画的好看&#xff0c;画的科学还是比较难的&#xff0c;现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…...

鸿蒙Android4个脚有脚线

效果 min:number122max:number150Row(){Stack(){// 底Text().border({width:2,color:$r(app.color.yellow)}).height(this.max).aspectRatio(1)// 长Text().backgroundColor($r(app.color.white)).height(this.max).width(this.min)// 宽Text().backgroundColor($r(app.color.w…...

【NetTopologySuite类库】geojson和shp互转,和自定义对象互转

geojson介绍 1. 示例 在visual studio中使用NuGet中安装了三个库&#xff08;.net4.7.2环境&#xff09;&#xff1a; NetTopologySuite 2.5NetTopologySuite.IO.Esri.Shapefile 1.2NetTopologySuite.IO.GeoJSON 4.0 1.1 shp数据转geojson 先创建一个shp文件作为例子&…...

【哇! C++】类和对象(三) - 构造函数和析构函数

目录 一、构造函数 1.1 构造函数的引入 1.2 构造函数的定义和语法 1.2.1 无参构造函数&#xff1a; 1.2.2 带参构造函数 1.3 构造函数的特性 1.4 默认构造函数 二、析构函数 2.1 析构函数的概念 2.2 特性 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中…...

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)

Ubuntu20.04本地配置IsaacLab的G1训练环境&#xff08;一&#xff09; 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面&#xff0c;如果Ubuntu剩余空间低于60G&#xff0c;则空间不足&#xff0c;除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…...

浅谈汽车系统电压优缺点分析

汽车电气系统的电压等级选择直接影响整车性能、能效和兼容性。以下是 12V、24V、48V 系统的简单介绍&#xff0c;包括技术特点、优缺点及典型应用场景。 汽车电气系统的发展随着车辆电子设备的增多和对能效要求的提高&#xff0c;电压等级也在逐步提升&#xff0c;从传统的12V…...

Springboot基础篇(4):自动配置原理

1 自动配置原理剖析 1.1 加载配置类的源码追溯 自动配置的触发入口&#xff1a; SpringBootApplication 组合注解是自动配置的起点&#xff0c;其核心包含 EnableAutoConfiguration&#xff0c;该注解使用AutoConfigurationImportSelector 实现配置类的动态加载。 启动类的注…...

Dify 开源大语言模型应用开发平台使用(一)

文章目录 一、创建锂电池专业知识解答应用1.1 应用初始化二、核心功能模块详解2.1 知识库构建2.2 工作流与节点编排节点类型说明工作流设计示例:锂电池选型咨询2.3 变量管理三、测试与调试3.1 单元测试3.2 压力测试3.3 安全验证四、部署与优化建议4.1 部署配置4.2 持续优化结论…...

机器学习深度学习基本概念:logistic regression和softmax

逻辑回归用来处理二分类问题 softmax用来处理多分类问题&#xff1a;比如llm在generate的时候&#xff0c;每个batch里面的一个样本的一个一次generate就是softmax生成一个大小为vocab_size的向量的概率分布&#xff0c;然后再采样 逻辑回归&#xff08;logistic regression&…...

OpenCV计算摄影学(16)调整图像光照效果函数illuminationChange()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对选定区域内的梯度场应用适当的非线性变换&#xff0c;然后通过泊松求解器重新积分&#xff0c;可以局部修改图像的表观照明。 cv::illuminati…...

Git - 补充工作中常用的一些命令

Git - 补充工作中常用的一些命令 1 一些场景1.1 场景11.2 场景21.3 场景31.4 场景41.5 场景51.6 场景61.7 场景71.8 场景81.9 场景91.10 场景101.11 场景111.12 场景121.13 场景131.14 场景141.15 场景15 2 git cherry-pick \<commit-hash\> 和 git checkout branch \-\-…...

使用Python的requests库调用API并处理JSON响应的详细步骤

1. 安装request库 pip install requests 2. 发送GET请求 import requests# 定义API地址 url "https://api.example.com/data"# 发送GET请求 response requests.get(url)# 检查HTTP状态码 if response.status_code 200:# 解析JSON响应data response.json()prin…...

Mybatis如何通过databaseId属性支持不同数据库的不同语法

目录 一、前言 二、如何配置 三、源码解读 四、自定义 一、前言 在一次项目功能测试中&#xff0c;发现有个sql在其他嵌入式数据库中执行正常&#xff0c;但是在mysql中执行失败&#xff0c;发现是因为有个字段在mysql中是关键字&#xff0c;需要使用反引号&#xff08;&…...

android edittext 防止输入多个小数点或负号

有些英文系统的输入法,或者定制输入法。使用xml限制不了输入多个小数点和多个负号。所以代码来控制。 一、通过XML设置限制 <EditTextandroid:id="@+id/editTextNumber"android:layout_width="wrap_content"android:layout_height="wrap_conten…...

windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐

windows部署spleeter 版本2.4.0&#xff1a;分离音频的人声和背景音乐 一、Spleeter 是什么&#xff1f; Spleeter 是由法国音乐流媒体公司 Deezer 开发并开源的一款基于深度学习的音频分离工具。它能够将音乐中的不同音轨&#xff08;如人声、鼓、贝斯、钢琴等&#xff09;分…...

深度学习、宽度学习、持续学习与终身学习:全面解析与其在大模型方面的应用

目录 引言&#xff1a; 1. 深度学习&#xff08;Deep Learning&#xff09; 1.1 深度学习的基本概念 1.2 深度学习的数学原理 1.3 深度学习的特点 1.4 深度学习在大模型中的应用 2. 宽度学习&#xff08;Wide Learning&#xff09; 2.1 宽度学习的基本概念 2.2宽度学习…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

深度解析云存储:概念、架构与应用实践

在数据爆炸式增长的时代&#xff0c;传统本地存储因容量限制、管理复杂等问题&#xff0c;已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性&#xff0c;成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理&#xff0c;云存储正重塑数据存储与…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...

数据库优化实战指南:提升性能的黄金法则

在现代软件系统中&#xff0c;数据库性能直接影响应用的响应速度和用户体验。面对数据量激增、访问压力增大&#xff0c;数据库性能瓶颈经常成为项目痛点。如何科学有效地优化数据库&#xff0c;提升查询效率和系统稳定性&#xff0c;是每位开发与运维人员必备的技能。 本文结…...

Ubantu-Docker配置最新镜像源250605

尝试其他镜像加速器 阿里云镜像加速器&#xff1a;登录阿里云&#xff0c;进入容器镜像服务获取专属加速器地址。毫秒镜像&#xff1a;https://docker.1ms.run。DockerHub镜像加速器&#xff1a;https://docker.xuanyuan.me。Docker Hub 镜像加速服务&#xff1a;https://dock…...