MyBatis-传递多个参数的方式
MyBatis 传递多个参数的方式
在 MyBatis 中,我们经常需要向 mapper
传递多个参数,比如查询条件、分页参数等。然而,由于 MyBatis
的参数处理方式较为特殊,直接传递多个参数可能会导致无法识别。本文将介绍几种常见的方式来传递多个参数。
1️⃣ 使用 @Param
注解(推荐)
📌 适用场景:适用于参数数量较少,且参数名称固定的情况。 @Select(“SELECT * FROM users WHERE name = #{name} AND age = #{age}”) List getUsersByNameAndAge(@Param(“name”) String name, @Param(“age”) int age); 💡 说明 :
@Param("name")
让 MyBatis 识别name
这个参数,SQL 语句中可直接使用#{name}
。- 适用于 参数数量较少,且参数名称固定 的情况。
2️⃣ 使用 Map
传递参数
📌 适用场景:参数动态变化,或者参数数量较多时。 @Select(“SELECT * FROM users WHERE name = #{name} AND age = #{age}”) List getUsersByMap(Map params); 调用示例 : Map paramMap = new HashMap<>(); paramMap.put(“name”, “Tom”); paramMap.put(“age”, 25); mapper.getUsersByMap(paramMap); 💡 说明 :
- 使用
Map
传递多个参数,可以动态添加参数。 - SQL 语句中仍然使用
#{name}
、#{age}
进行参数映射。
3️⃣ 使用实体类封装参数
📌 适用场景:参数较多且结构固定时,适用于对象查询。 @Select(“SELECT * FROM users WHERE name = #{name} AND age = #{age}”) List getUsersByEntity(User user); 调用示例 : User user = new User(); user.setName(“Tom”); user.setAge(25); mapper.getUsersByEntity(user); 💡 说明 :
- 适用于参数固定的情况,代码结构清晰,可读性高。
- 但是不适用于参数可变的查询需求。
4️⃣ 直接使用 List
或 Array
📌 适用场景:批量查询、IN 查询等。 @Select(“SELECT * FROM users WHERE id IN (${ids})”) List getUsersByIds(@Param(“ids”) List ids); 调用示例 : List idList = Arrays.asList(1, 2, 3); mapper.getUsersByIds(idList); 💡 说明 :
- 适用于 批量查询 ,但要注意 SQL 注入风险。
- 如果
IN
语句中参数较多,建议使用foreach
方式处理(XML 方式)。
5️⃣ XML 方式处理多个参数(parameterType
)
在 mapper.xml
文件中,MyBatis 允许使用 parameterType
传递对象参数。
SELECT * FROM users WHERE name = #{name} AND age = #{age}
💡 说明 :
- XML 方式可以配合
Map
、实体类等方式传递多个参数。 - 在
parameterType
中使用map
时,可以动态传递参数。
6️⃣ 对比总结 📊
方式 | 适用场景 | 代码简洁度 | 灵活性 |
---|---|---|---|
@Param 注解 | 少量参数 | 高 | 低 |
Map 传参 | 参数动态变化 | 中 | 高 |
实体类封装 | 固定结构参数 | 高 | 低 |
List/Array | 批量查询 | 高 | 中 |
XML 配合 parameterType | XML 方式参数传递 | 低 | 高 |
7️⃣ 总结 🚀
✅ @Param
适用于 少量参数,简单清晰 。
✅ Map
适用于 参数动态变化的查询 。
✅ 实体类适用于 结构固定的查询 ,推荐封装参数对象。
✅ List/Array
适用于 批量查询 ,但注意 SQL 注入风险。
✅ XML 方式适用于 复杂 SQL 处理 ,但可读性相对较低。