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

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.lryc.cn/news/617268.html

相关文章:

  • 三种常见的菜单路由封装方式详解
  • 邬贺铨院士:AI与数字安全融合是数字化建设核心驱动力
  • 算法73. 矩阵置零
  • Dubbo从入门到实战:分布式服务开发指南
  • React18 Transition特性详解
  • Apache IoTDB 全场景部署:跨「端-边-云」的时序数据库 DB+AI 实战
  • 智能制造算力一体机:工业 4.0 时代的算力基建革命
  • WPF之绑定!
  • 源码分析Eino框架工具调用--创建篇
  • 瑞芯微rk3588:yolov8-obb训练实战笔记
  • 云原生环境 Prometheus 企业级监控实战
  • 容器 K8S Docker Kata 学习(一)
  • k8s的calico是什么作用,举例一下
  • 【软考中级网络工程师】知识点之 UDP 协议:网络通信中的高效轻骑兵
  • k8s PV和PVC开始总结
  • AI时代基于云原生的 CI/CD 基础设施 Tekton
  • RabbitMQ 声明队列和交换机详解
  • HTTPS 协议原理 ——4种方案
  • HTTPS的应用层协议
  • 2024年ESWA SCI1区TOP,自适应种群分配和变异选择差分进化算法iDE-APAMS,深度解析+性能实测
  • 在 ASP.NET 项目中用 C# 生成二维码
  • 为 Promethus 配置https访问
  • 无人机航拍数据集|第12期 无人机停车场车辆计数目标检测YOLO数据集1568张yolov11/yolov8/yolov5可训练
  • FP32、BF16、FP16三种方式比较
  • 计算机视觉CS231n学习(7)
  • 《范仲淹传》读书笔记与摘要
  • MySQL数据库简介
  • MySQL-日志
  • Vue 3 快速入门 第六章
  • Linux操作系统从入门到实战(十九)进程状态