MyBatis @Param 注解详解:指定的参数找不到?
MyBatis @Param 注解详解
1. @Param 注解的作用
@Param 注解用于显式指定方法参数的名称,让 MyBatis 在 SQL 映射文件(XML)或注解中通过该名称访问参数。
核心场景:
- 方法有多个参数时,避免参数名丢失或混淆。
- 参数为简单类型(如
String,int)且未封装成对象时,明确参数名。
2. 加与不加 @Param 的区别
| 场景 | 不加 @Param | 加 @Param |
|---|---|---|
| 单参数(简单类型) | 默认可用参数名(需编译保留参数名)或 _parameter | 强制绑定到指定名称(如 @Param("id") → #{id}) |
| 多参数(简单类型) | 必须通过 param1, param2 或 arg0, arg1 访问 | 直接通过注解名称访问(如 #{name}, #{age}) |
| 参数为对象或 Map | 直接通过属性名或键访问(如 #{user.id}) | 需通过 @Param 别名访问(如 #{user.id} → #{u.id}) |
3. 常见报错原因分析
情况1:加了 @Param 却报“变量未找到”
-
原因1:注解名称与 XML 占位符不匹配
// 方法定义 User getUserById(@Param("userId") int id); // 注解名为 "userId"// XML 错误写法 SELECT * FROM user WHERE id = #{id}; // 应该用 #{userId} -
原因2:动态 SQL 中错误引用
在<if>或<foreach>中未正确使用注解名:<select id="getUsers">SELECT * FROM user WHERE name = #{name} <!-- 正确 --><if test="age != null">AND age = #{userAge} <!-- 错误:@Param 未定义 "userAge" --></if> </select>
情况2:不加 @Param 却报“变量未找到”
-
原因1:编译未保留参数名
未在编译时添加-parameters选项(Java 8+ 支持),导致 MyBatis 无法获取参数名,只能通过param1或arg0访问:// 方法定义 User getUserByNameAndAge(String name, int age); // XML 错误写法(未启用 -parameters 时) SELECT * FROM user WHERE name = #{name} AND age = #{age}; // 正确写法(不加 @Param 时) SELECT * FROM user WHERE name = #{param1} AND age = #{param2}; -
原因2:多参数未封装成对象或 Map
若方法有多个简单类型参数且未使用@Param,必须通过param1/arg0或param2/arg1访问:// 方法定义 User getUser(String name, int age); // XML 正确写法 SELECT * FROM user WHERE name = #{param1} AND age = #{param2};
4. 最佳实践
-
单简单类型参数:
- 若编译保留参数名(添加
-parameters),可不加@Param。 - 否则建议显式添加
@Param。
- 若编译保留参数名(添加
-
多参数:
- 始终使用
@Param明确参数名,避免依赖param1或arg0。
- 始终使用
-
对象或 Map 参数:
- 直接通过属性或键访问(如
#{user.id}),无需@Param。 - 若需别名,可加
@Param并调整访问路径(如@Param("u") User user→#{u.id})。
- 直接通过属性或键访问(如
-
动态 SQL:
- 在
<if>或<foreach>中,确保test表达式中的变量名与@Param一致。
- 在
5. 示例代码
正确使用 @Param
// 方法定义
List<User> findUsers(@Param("name") String name, @Param("minAge") int minAge
);// XML 映射
<select id="findUsers">SELECT * FROM user WHERE name = #{name}AND age >= #{minAge}
</select>
错误示例(不加 @Param 导致问题)
// 方法定义(未启用 -parameters 编译选项)
User getUser(String name, int age);// XML 错误写法
SELECT * FROM user WHERE name = #{name} AND age = #{age}; // 正确写法(通过 param1/param2)
SELECT * FROM user WHERE name = #{param1} AND age = #{param2};
总结
@Param 的核心作用是明确参数名称,避免因参数名丢失或歧义导致的错误。报错的根本原因通常是名称不匹配或参数绑定机制不清晰。根据参数类型和数量,合理选择是否使用 @Param,并在 XML 中严格匹配名称即可解决问题。
相关文章:
MyBatis @Param 注解详解:指定的参数找不到?
MyBatis Param 注解详解 1. Param 注解的作用 Param 注解用于显式指定方法参数的名称,让 MyBatis 在 SQL 映射文件(XML)或注解中通过该名称访问参数。 核心场景: 方法有多个参数时,避免参数名丢失或混淆。参数为简单…...
【项目日记(八)】内存回收与联调
前言 我们前面实现了三层缓存申请的过程,并完成了三层缓存申请过程的联调!本期我们来介绍三层的缓存的回收机制以及三层整体联调释放的过程。 目录 前言 一、thread cache 回收内存 二、central cache 回收内存 • 如何确定一个对象对应的span • …...
性能测试监控工具jmeter+grafana
1、什么是性能测试监控体系? 为什么要有监控体系? 原因: 1、项目-日益复杂(内部除了代码外,还有中间件,数据库) 2、一个系统,背后可能有多个软/硬件组合支撑,影响性能的因…...
016.3月夏令营:数理类
016.3月夏令营:数理类: 中国人民大学统计学院: http://www.eeban.com/forum.php?modviewthread&tid386109 北京大学化学学院第一轮: http://www.eeban.com/forum.php?m ... 6026&extrapage%3D1 香港大学化学系夏令营&a…...
CS144 Lab Checkpoint 0: networking warm up
Set up GNU/Linux on your computer 我用的是Ubuntu,按照指导书上写的输入如下命令安装所需的软件包: sudo apt update && sudo apt install git cmake gdb build-essential clang \ clang-tidy clang-format gcc-doc pkg-config glibc-doc tc…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
给没有登录认证的web应用添加登录认证(openresty lua实现)
这阵子不是deepseek火么?我也折腾了下本地部署,ollama、vllm、llama.cpp都弄了下,webui也用了几个,发现nextjs-ollama-llm-ui小巧方便,挺适合个人使用的。如果放在网上供多人使用的话,得接入登录认证才好&a…...
3月5日作业
代码作业: #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在,请选择操作: 1) 清空目录内容 2) 保留目…...
【MySQL】增删改查
目录 一、新增(Create) 单行数据 全列插入 多行数据 指定列插入 插入时间 二、查询(Retrieve) 全列查询 指定列查询 查询字段为表达式 别名 去重:DISTINCT 排序:ORDER BY 条件查询࿱…...
【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成
标题:《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目:https://zju3dv.github.io/StarGen 来源:商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…...
线反转法实现矩形键盘按键识别
由于行、列线为多键共用,各按键彼此将相互发 生影响,必须将行、列线信号配合起来并作适当的处 理,才能确定闭合键的位置。 线反转法 第1步:列线输出为全低电平,则行线中电平由高变低 的所在行为按键所在行。 第2步&…...
在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值
文章目录 引言轻松实现 `<el-option>` 的默认值为 `null`I 实现方式监听清空事件 【推荐】使用 v-model 绑定 null添加一个值为 null 的选项处理 null 值的显示引言 背景:接口签名规则要求空串参与,空对象不参与签名计算 // 空字符串“” 参与签名组串,null不参与签…...
大白话面试中应对自我介绍
在面试中,自我介绍是开场的关键环节,它就像你递给面试官的一张“个人名片”,要让面试官快速了解你并对你产生兴趣。下面详细讲讲应对自我介绍的要点及回答范例。 一、自我介绍的时间把控 一般面试中的自我介绍控制在1 - 3分钟比较合适。时间…...
Pytorch构建LeNet进行MNIST识别 #自用
LeNet是一种经典的卷积神经网络(CNN)结构,由Yann LeCun等人在1998年提出,主要用于手写数字识别(如MNIST数据集)。作为最早的实用化卷积神经网络,LeNet为现代深度学习模型奠定了基础,…...
元宇宙崛起:区块链与金融科技共绘数字新世界
文章目录 一、引言二、元宇宙与区块链的深度融合三、区块链在元宇宙金融中的应用四、金融科技在元宇宙中的创新应用五、面临的挑战与机遇《区块链与金融科技》亮点内容简介获取方式 一、引言 随着科技的飞速发展,元宇宙概念逐渐走进人们的视野,成为数字…...
React Native 实现滑一点点内容区块指示器也滑一点点
效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...
怎么写C#命令行参数程序,及控制台带参数案例(程序完整源码)下载
C#命令行参数解析控制台带参数编写案例(程序完整源码)下载链接 https://download.csdn.net/download/luckyext/90434790 在CMD命令窗口,输入ping 、ipconfig等这样的命令,大家应该都知道,但很多同学可能不知道怎么写…...
全国青少年航天创新大赛各项目对比分析
全国青少年航天创新大赛各项目对比分析 一、比赛场地对比 项目名称场地尺寸场地特点组别差异筑梦天宫虚拟三维场景动态布局,小学组3停泊处,初高中组6停泊处;涉及传送带、机械臂、传感器等虚拟设备。初中/高中组任务复杂度更高,运…...
基于RAG的法律条文智能助手
文章目录 前言一、 项目背景与需求设计二、 数据收集与整理三、 核心实现流程1. 配置与模型初始化1. 配置区2. 模型初始化(init_models 函数)3. 数据加载与验证(load_and_validate_json_files 函数)4. 节点生成(create…...
智能对讲机:5G+AI赋能下的石油工业新“声”态
在浩瀚的能源版图上,中国正以非凡的“深度”探索着石油资源的奥秘。随着5G技术的不断成熟与普及,曾经“满山遍野找信号”的石油工人,如今已步入了一个全新的通信时代。在这个时代里,智能对讲机成为了连接指挥中心与一线工人的桥梁…...
Unpaywall:当学术研究遇上智能助手,如何一键解锁全球开放获取文献
Unpaywall:当学术研究遇上智能助手,如何一键解锁全球开放获取文献 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors…...
【免费下载】 Cadence Allegro 多层板设计经典案例分享:助你快速提升设计技能
Cadence Allegro 多层板设计经典案例分享:助你快速提升设计技能 项目介绍 在电子设计领域,Cadence Allegro 是一款广泛使用的 PCB 设计软件,尤其在多层板设计中表现出色。为了帮助广大工程师和学习者更好地掌握 Allegro 的使用技巧࿰…...
【免费下载】 Windows Installer Clean Up 简体中文版
Windows Installer Clean Up 简体中文版 【下载地址】WindowsInstallerCleanUp简体中文版 本仓库提供了一个名为“Windows Installer Clean Up 简体中文”的资源文件下载。该工具是一款专门用于清理Windows系统中的安装程序残留文件的实用工具。通过使用此工具,您可…...
如何在Windows 11上搭建专业级Android开发环境:WSA完全指南
如何在Windows 11上搭建专业级Android开发环境:WSA完全指南 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA Windows Subsystem for Android&…...
Windows安卓应用安装器:5步实现电脑直接运行APK应用
Windows安卓应用安装器:5步实现电脑直接运行APK应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过,如果能在Windows电脑上直接运…...
别再傻傻串联了!聊聊数字电路里移位器的三种实现:从简单开关到桶形和对数结构
数字电路设计中的移位器架构选择:从基础实现到性能优化 在数字电路设计中,移位操作是最基础却又最容易被低估的功能之一。许多刚入行的工程师往往会采用最简单的串联移位结构,直到项目遇到性能瓶颈才开始思考优化方案。实际上,移…...
HS2-HF_Patch汉化补丁:3分钟打造完美中文游戏体验
HS2-HF_Patch汉化补丁:3分钟打造完美中文游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的日文界面而烦恼吗…...
终极指南:vue-fastapi-admin 容器化部署与生产环境配置的10个关键步骤
终极指南:vue-fastapi-admin 容器化部署与生产环境配置的10个关键步骤 【免费下载链接】vue-fastapi-admin ⭐️ 基于 FastAPIVue3Naive UI 的现代化轻量管理平台 A modern and lightweight management platform based on FastAPI, Vue3, and Naive UI. 项目地址:…...
别焦虑,也别躺平:给年轻程序员的一封信
2026年了,程序员这个行业,和前几年的感觉已经完全不一样了。以前大家更多的是在想: 谁会的框架多谁加班狠谁能把CRUD写得飞快 现在很多东西,AI十几秒就能生成。不少年轻程序员开始焦虑: “以后是不是不需要程序员了&am…...
用Obsidian+Templater插件打造你的专属日记系统:从脚本编写到自动归档
用ObsidianTemplater打造全自动日记管理系统:从脚本开发到智能归档 在数字时代,个人知识管理已成为现代人的必修课。当大多数日记应用将你的私人记忆锁在云端服务器时,一种更自主、更灵活的选择正在技术爱好者中流行——用Obsidian配合Templa…...
