在学习、面试、工作中的题型知识,在 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
🌟 小贴士
@Param
使用最简单,推荐优先使用。- 如果参数名与数据库字段名不一致,建议使用
@Param
进行重命名。 foreach
是处理集合或批量数据的常用方法,灵活性高。