文章目录
-
- [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️⃣ 总结 🚀)
- [1️⃣ 使用 `@Param` 注解(推荐)](#1️⃣ 使用
在 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 处理,但可读性相对较低。