文章目录
- 
- [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 处理,但可读性相对较低。