MyBatis 传递多个参数的方式

文章目录

    • [1️⃣ 使用 `@Param` 注解(推荐)](#1️⃣ 使用 @Param 注解(推荐))
    • [2️⃣ 使用 `Map` 传递参数](#2️⃣ 使用 Map 传递参数)
    • [3️⃣ 使用实体类封装参数](#3️⃣ 使用实体类封装参数)
    • [4️⃣ 直接使用 `List` 或 `Array`](#4️⃣ 直接使用 List 或 Array)
    • [5️⃣ XML 方式处理多个参数(`parameterType`)](#5️⃣ XML 方式处理多个参数(parameterType))
    • [6️⃣ 对比总结 📊](#6️⃣ 对比总结 📊)
    • [7️⃣ 总结 🚀](#7️⃣ 总结 🚀)

在 MyBatis 中,我们经常需要向 mapper 传递多个参数,比如查询条件、分页参数等。然而,由于 MyBatis 的参数处理方式较为特殊,直接传递多个参数可能会导致无法识别。本文将介绍几种常见的方式来传递多个参数。


1️⃣ 使用 @Param 注解(推荐)

📌 适用场景:适用于参数数量较少,且参数名称固定的情况。

java 复制代码
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") int age);

💡 说明:

  • @Param("name") 让 MyBatis 识别 name 这个参数,SQL 语句中可直接使用 #{name}。
  • 适用于 参数数量较少,且参数名称固定 的情况。

2️⃣ 使用 Map 传递参数

📌 适用场景:参数动态变化,或者参数数量较多时。

java 复制代码
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> getUsersByMap(Map<String, Object> params);

调用示例:

java 复制代码
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "Tom");
paramMap.put("age", 25);
mapper.getUsersByMap(paramMap);

💡 说明:

  • 使用 Map<String, Object> 传递多个参数,可以动态添加参数。
  • SQL 语句中仍然使用 #{name}、#{age} 进行参数映射。

3️⃣ 使用实体类封装参数

📌 适用场景:参数较多且结构固定时,适用于对象查询。

java 复制代码
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> getUsersByEntity(User user);

调用示例:

java 复制代码
User user = new User();
user.setName("Tom");
user.setAge(25);
mapper.getUsersByEntity(user);

💡 说明:

  • 适用于参数固定的情况,代码结构清晰,可读性高。
  • 但是不适用于参数可变的查询需求。

4️⃣ 直接使用 List 或 Array

📌 适用场景:批量查询、IN 查询等。

java 复制代码
@Select("SELECT * FROM users WHERE id IN (${ids})")
List<User> getUsersByIds(@Param("ids") List<Integer> ids);

调用示例:

java 复制代码
List<Integer> idList = Arrays.asList(1, 2, 3);
mapper.getUsersByIds(idList);

💡 说明:

  • 适用于 批量查询,但要注意 SQL 注入风险。
  • 如果 IN 语句中参数较多,建议使用 foreach 方式处理(XML 方式)。

5️⃣ XML 方式处理多个参数(parameterType)

在 mapper.xml 文件中,MyBatis 允许使用 parameterType 传递对象参数。

xml 复制代码
<select id="getUsersByNameAndAge" parameterType="map" resultType="User">
    SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>

💡 说明:

  • XML 方式可以配合 Map、实体类等方式传递多个参数。
  • 在 parameterType 中使用 map 时,可以动态传递参数。

6️⃣ 对比总结 📊

方式 适用场景 代码简洁度 灵活性
@Param 注解 少量参数 高 低
Map 传参 参数动态变化 中 高
实体类封装 固定结构参数 高 低
List/Array 批量查询 高 中
XML 配合 parameterType XML 方式参数传递 低 高

7️⃣ 总结 🚀

✅ @Param 适用于 少量参数,简单清晰。

✅ Map 适用于 参数动态变化的查询。

✅ 实体类适用于 结构固定的查询,推荐封装参数对象。

✅ List/Array 适用于 批量查询,但注意 SQL 注入风险。

✅ XML 方式适用于 复杂 SQL 处理,但可读性相对较低。

相关推荐
鱼宵6 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21
卷无止境6 小时前
给AI装上一双眼睛:快速构建代码验证器的思路与落地方案
后端·python
学长毕设6 小时前
基于SpringBoot的餐厅管理系统-附源码
java·spring boot·后端
刚入门的大一新生7 小时前
Linux-线程互斥
java·开发语言
赵小哥要冲啦7 小时前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai7 小时前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
二哈赛车手8 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu8 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小羊没烦恼!8 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
考虑考虑9 小时前
瀚高数据库
数据库·后端·postgresql