在学习、面试、工作中的题型知识,在 MyBatis 中,查询中传入多个参数有多种方法,主要包括以下几种常见方式:

1. 使用 @Param 注解传入多个参数

在接口方法中通过 @Param 注解为每个参数取名,然后在 SQL 语句中用 #{参数名} 来引用。

示例

假设需要通过用户名和年龄查询用户信息:

① Mapper 接口

public interface UserMapper {
    List<User> getUserByNameAndAge(@Param("name") String name, @Param("age") int age);
}

② Mapper.xml 文件

<select id="getUserByNameAndAge" resultType="User">
    SELECT * FROM users
    WHERE user_name = #{name} AND user_age = #{age}
</select>

③ 调用方法

List<User> users = userMapper.getUserByNameAndAge("Tom", 25);

👉 解释

  • @Param("name"):为方法参数取名,供 SQL 语句中使用
  • #{name}:在 SQL 语句中用 #{} 引用参数名
  • 通过 @Param 可以在 XML 中直接使用参数名

2. 通过 Map 传入多个参数

将参数封装成一个 Map,然后在 SQL 语句中通过 #{key} 访问。

示例

① Mapper 接口

public interface UserMapper {
    List<User> getUserByNameAndAge(Map<String, Object> params);
}

② Mapper.xml 文件

<select id="getUserByNameAndAge" resultType="User">
    SELECT * FROM users
    WHERE user_name = #{name} AND user_age = #{age}
</select>

③ 调用方法

Map<String, Object> params = new HashMap<>();
params.put("name", "Tom");
params.put("age", 25);
List<User> users = userMapper.getUserByNameAndAge(params);

👉 解释

  • 使用 Map 封装多个参数
  • 在 SQL 语句中通过 #{key} 直接取值

3. 通过 Java 对象传入多个参数

将参数封装到一个 Java Bean(POJO)对象中,MyBatis 可以自动识别对象的属性。

示例

① 定义参数类

public class UserQuery {
    private String name;
    private int age;

    // 省略 getter 和 setter
}

② Mapper 接口

public interface UserMapper {
    List<User> getUserByNameAndAge(UserQuery query);
}

③ Mapper.xml 文件

<select id="getUserByNameAndAge" resultType="User">
    SELECT * FROM users
    WHERE user_name = #{name} AND user_age = #{age}
</select>

④ 调用方法

UserQuery query = new UserQuery();
query.setName("Tom");
query.setAge(25);
List<User> users = userMapper.getUserByNameAndAge(query);

👉 解释

  • 将多个参数封装为对象
  • 通过 #{属性名} 直接访问对象的属性
  • 适合参数较多或结构复杂的情况

4. 使用数组或集合传入多个参数

如果需要传入一组参数(如 ID 列表或名称列表),可以使用数组或 List

示例

① Mapper 接口

public interface UserMapper {
    List<User> getUsersByIds(@Param("ids") List<Integer> ids);
}

② Mapper.xml 文件

使用 IN 语句和 foreach 处理集合参数:

<select id="getUsersByIds" resultType="User">
    SELECT * FROM users
    WHERE user_id IN
    <foreach item="id" collection="ids" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

③ 调用方法

List<Integer> ids = Arrays.asList(1, 2, 3);
List<User> users = userMapper.getUsersByIds(ids);

👉 解释

  • collection="ids":指定参数名
  • foreach 用于循环参数,生成 IN 语句
  • open="("close=")" 控制括号
  • separator="," 控制分隔符

5. 使用多个参数时的访问方式

方式访问方式适用场景
@Param#{name}参数个数较少且清晰
Map#{key}参数动态性强,数量不定
Java Bean#{属性名}参数复杂且数量多
数组或集合#{id} + foreach传入列表或批量参数

✅ 推荐使用场景总结

  • 参数数量少 → @Param
  • 参数结构复杂或数量多 → Java Bean
  • 参数动态或结构不固定 → Map
  • 批量传参(如 ID 列表)→ 集合 + foreach

🌟 小贴士

  1. @Param 使用最简单,推荐优先使用。
  2. 如果参数名与数据库字段名不一致,建议使用 @Param 进行重命名。
  3. foreach 是处理集合或批量数据的常用方法,灵活性高。