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

Mybatis @Param参数传递说明

MyBatis 在各个参数场景下,不同数据类型的默认参数名及使用规则的详细总结:

一、基础数据类型(非集合/非数组)

包含类型String、Integer、Long、Boolean、Double 等包装类及基本类型(如 int、long)。

默认参数名规则:
  • 无需指定参数名,MyBatis 会直接绑定唯一参数值。
  • XML 中 #{任意名称} 均可生效(名称仅作为占位符,不影响绑定)。
示例:
// Mapper 接口(无 @Param)
User selectByUsername(String username);
<!-- XML 映射(任意名称均可) -->
<select id="selectByUsername" resultType="User">SELECT * FROM user WHERE username = #{name}  <!-- 可用 username/abc/任意名称 -->
</select>
特点:
  • 绝对不会报错(只要参数类型匹配),无需担心“参数找不到”问题。
  • 推荐:虽然可省略 @Param,但复杂场景下建议添加以增强可读性(如 @Param("username"))。

二、集合类型(Collection 及其子类)

包含类型List、Set、Collection 等。

默认参数名规则:
  • MyBatis 会自动赋予默认名称:
    • Collection 及其子类通用默认名:collection
    • List 类型额外支持 list 作为名称(更常用)
示例:
// Mapper 接口(无 @Param)
List<User> selectByIds(List<Long> ids);
<!-- XML 映射(必须用默认名) -->
<select id="selectByIds" resultType="User">SELECT * FROM user WHERE id IN<foreach collection="list" item="id" open="(" separator="," close=")">  <!-- 用 list 或 collection -->#{id}</foreach>
</select>
注意:
  • 如果 XML 中用了非默认名(如 collection="ids"),会直接报错 Parameter 'ids' not found
  • 解决:添加 @Param("ids") 注解,XML 中即可用 collection="ids"

三、数组类型

包含类型String[]、Integer[]、Long[] 等任意数组。

默认参数名规则:
  • 固定默认名称为 array,无其他可选名称。
示例:
// Mapper 接口(无 @Param)
List<User> selectByRoles(String[] roles);
<!-- XML 映射(必须用 array) -->
<select id="selectByRoles" resultType="User">SELECT * FROM user WHERE role IN<foreach collection="array" item="role" open="(" separator="," close=")">#{role}</foreach>
</select>
注意:
  • 若 XML 中用 list 或自定义名(如 roles),会报错 Parameter 'xxx' not found
  • 解决:添加 @Param("roles") 注解,XML 中即可用 collection="roles"

四、JavaBean/自定义对象

包含类型:自定义实体类(如 User、Order)、Map 等。

默认参数名规则:
  • 直接使用对象的属性名作为参数名(无需指定默认名)。
  • Map 类型直接使用 key 作为参数名。
示例:
// Mapper 接口(无 @Param)
void updateUser(User user);  // User 有 id、username 等属性
<!-- XML 映射(直接用属性名) -->
<update id="updateUser">UPDATE user SET username = #{username}, age = #{age} WHERE id = #{id}  <!-- 直接引用 User 的属性 -->
</update>
特点:
  • 无需关心参数名,直接通过对象属性绑定,不会报错。
  • 若用 @Param("user") 注解,XML 中需用 #{user.username} 引用(不推荐,徒增复杂度)。

五、特殊场景:多参数(即使包含单个集合/数组)

当方法有多个参数时,无论类型如何,必须用 @Param 注解指定名称,否则 MyBatis 无法识别参数名,只能用 arg0、arg1param1、param2 引用(不推荐)。

示例:
// 错误写法(多参数无 @Param)
List<User> selectByCondition(String name, List<Long> deptIds);  // 会报错// 正确写法(用 @Param 区分)
List<User> selectByCondition(@Param("name") String name, @Param("deptIds") List<Long> deptIds
);
<!-- XML 映射(用注解指定的名称) -->
<select id="selectByCondition" resultType="User">SELECT * FROM user WHERE name LIKE #{name} AND dept_id IN <foreach collection="deptIds" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>

总结表格

参数类型无 @Param 时的默认名称XML 中引用示例是否可能报错
基础类型(String、Integer等)无(任意名称均可)#{任意名称}不会报错
List/Collectioncollection、list(List特有)#{list[0]}、foreach collection=“list”用错名称会报错
数组(String[]、Integer[]等)arrayforeach collection=“array”用错名称会报错
JavaBean/Map直接用属性名/key#{username}、#{mapKey}不会报错
多参数(任意类型)arg0、arg1 或 param1、param2#{arg0}、#{param1}不用 @Param 必报错

最佳实践

  1. 基础类型单参数:可省略 @Param,但建议添加以增强代码可读性。
  2. 集合/数组单参数:必须添加 @Param(如 @Param("ids")),避免依赖默认名导致的潜在问题。
  3. 多参数:强制添加 @Param,明确区分每个参数。
  4. JavaBean/Map:无需添加 @Param,直接用属性名引用即可。

遵循以上规则可避免 99% 的 MyBatis 参数绑定错误。

http://www.xdnf.cn/news/17586.html

相关文章:

  • 【工作笔记】Wrappers.lambdaQuery()用法
  • RK3588在YOLO12(seg/pose/obb)推理任务中的加速方法
  • JS数组排序算法
  • 打靶日常-upload-labs(21关)
  • 【密码学】8. 密码协议
  • Android 开发问题:Invalid id; ID definitions must be of the form @+id/ name
  • 【系统分析师】软件需求工程——第11章学习笔记(上)
  • A#语言详解
  • GitHub上为什么采用Gradle编译要多于Maven
  • 【走进Docker的世界】深入理解Docker网络:从模式选择到实战配置
  • AI质检数据准备利器:基于Qt/QML 5.14的图像批量裁剪工具开发实战
  • 【代码随想录day 15】 力扣 404. 左叶子之和
  • nginx+Lua环境集成、nginx+Lua应用
  • 自动化备份全网服务器数据平台
  • UE材质World Position 和 Object Position
  • Linux操作系统从入门到实战(十七)进程与进程基本概念
  • Redis一站式指南一:从MySQL事务到Redis持久化及事务实现
  • Error: error:0308010C:digital envelope routines::unsupported at new Hash
  • 计算机视觉(CV)——pytorch张量基本使用
  • 青龙峡拔韭菜
  • 【东枫科技】NTN-IOT 卫星互联网原型系统,高达1.6G大带宽
  • 免费数字人API开发方案
  • 使用正则表达式检测Base64字符串并提取图片类型及正文的JavaScript函数,代码精简且高效
  • How Websites Work 网站如何运作
  • Linux入门指南:26个基础命令全解析
  • C语言(长期更新)第10讲:操作符详解(二)
  • vue3项目中在一个组件中点击了该组件中的一个按钮,那么如何去触发另一个组件中的事件?
  • playwright-mcp 项目全解析:从理论到实践
  • 量子计算机实用化:从理论到现实的艰难跨越
  • (一)Tailwindcss