深入解析:【Java-MyBatis】MyBatis 支持哪些传参数的方法?

下面我将详细讲解 MyBatis 支持的参数传递方法,并附上通俗易懂的解释和示例:
1. 单个基本类型参数
当方法只有一个基本类型参数(如 int, String)时,MyBatis 会自动识别:
User getUserById(int id);
// 接口方法
<select id="getUserById" resultType="User">
SELECT * FROM user WHERE id = #{id} <!-- 直接使用参数名 -->
</select>
就像告诉服务员:“给我3号桌的菜单” -
#{id}就是桌号
2. @Param 注解(推荐)
当方法有多个参数时,用 @Param 给参数起别名:
List<
User> findUsers(
@Param("name") String name,
@Param("minAge") int minAge
);
<select id="findUsers" resultType="User">
SELECT * FROM user
WHERE name = #{name} AND age > #{minAge}
</select>
就像点餐:“要宫保鸡丁(@Param(‘main’))和酸辣汤(@Param(‘soup’))”
3. Map 传参
将多个参数放入 Map 中传递:
Map<
String, Object> params = new HashMap<
>();
params.put("role", "admin");
params.put("status", 1);
List<
User> getUsersByMap(Map params);
<select id="getUsersByMap" resultType="User">
SELECT * FROM user
WHERE role = #{role} AND status = #{status}
</select>
️ 类似递菜单:把要点的菜(参数)都写在便签上交给服务员
4. JavaBean 对象传参
使用 POJO 对象封装参数:
public class UserQuery
{
private String name;
private Integer minAge;
// getter/setter
}
List<
User> searchUsers(UserQuery query);
<select id="searchUsers" resultType="User">
SELECT * FROM user
WHERE name = #{name} AND age > #{minAge}
</select>
就像打包行李:把零散物品(参数)装进行李箱(JavaBean)统一携带
5. 集合类型参数
处理 List/Array 等集合参数:
List<
User> getUsersByIds(@Param("ids") List<
Integer> ids);
<select id="getUsersByIds" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</select>
类似报菜名:“要1号、3号、5号套餐” → MyBatis 自动拆解集合
6. 位置参数(不推荐)
按参数位置引用(MyBatis 3.3 前支持):
<select id="findUser" resultType="User">
SELECT * FROM user
WHERE name = #{0} AND age = #{1} <!-- 0代表第一个参数 -->
</select>
⚠️ 风险:像说"给我那个和那个" - 容易混淆顺序
7. 特殊参数 _parameter
所有参数的统一引用点:
<select id="complexQuery" resultType="User">
<!-- 通过_parameter访问整个参数对象 -->
WHERE name = #{_parameter.name}
</select>
总结对比表
| 传参方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
@Param 注解 | 多参数方法 | 直观清晰 | 需写注解 |
| JavaBean 对象 | 复杂查询条件 | 结构化/复用性强 | 需创建额外类 |
| Map | 动态参数 | 灵活无需定义类 | 类型不安全 |
| 集合参数 | IN 查询 | 天然支持集合操作 | 需结合 foreach |
| 位置参数 | 简单临时查询 | 快速实现 | 可读性差/易出错 |

最佳实践建议:
- 1-2个参数 → 优先用
@Param注解- 3+个参数 → 使用 JavaBean 封装
- 动态条件查询 → 选用 Map 或 JavaBean+动态SQL
- 避免使用位置参数,提高可维护性

浙公网安备 33010602011771号