一、MyBatis 参数绑定机制
1.1 核心概念
当 Mapper 接口方法接收多个参数时,MyBatis 提供三种参数绑定方式:
- 默认参数名:
arg0
、arg1
(Java 8+)或param1
、param2
- @Param 注解:显式指定参数名称
- POJO/DTO 对象:通过对象属性访问(本教程不涉及)
二、arg 参数(参数顺序索引)
2.1 使用场景
适用于没有使用 @Param 注解的情况,通过参数在方法中的顺序位置进行绑定。
2.2 XML 映射示例
<select id="findBySalary2" resultType="Emp">SELECT * FROM emp WHERE salary >= #{arg0} AND salary <= #{arg1}
</select>
2.3 Java 接口定义
List<Emp> findBySalary2(Double start, Double end);
2.4 特点
- 索引从
0
开始 - 参数顺序敏感(调换参数顺序会导致逻辑错误)
- 可读性较低(推荐在参数较少时使用)
三、param 参数(自动编号索引)
3.1 使用场景
MyBatis 为每个参数自动生成的别名,编号从 1 开始。
3.2 XML 映射示例
<select id="findBySalary1" resultType="Emp">SELECT * FROM emp WHERE salary >= #{param1} AND salary <= #{param2}
</select>
3.3 Java 接口定义
List<Emp> findBySalary1(Double start, Double end);
3.4 特点
- 索引从
1
开始 - 与
arg
索引共存(可用两种方式交叉访问) - 适用于需要明确位置编号的场景
四、@Param 注解(显式命名参数)
4.1 使用场景
当需要明确参数语义或方法有多个参数时推荐使用。
4.2 XML 映射示例
<select id="findBySalary3" resultType="Emp">SELECT * FROM emp WHERE salary >= #{minSalary} AND salary <= #{maxSalary}
</select>
4.3 Java 接口定义
List<Emp> findBySalary3(@Param("minSalary") Double start, @Param("maxSalary") Double end
);
4.4 特点
- 参数名与业务语义强关联
- 不依赖参数顺序
- 代码可维护性最佳
- 支持与
param
/arg
方式混用
五、对比总结
方式 | 索引起点 | 顺序敏感性 | 可读性 | 推荐场景 |
---|---|---|---|---|
arg0, arg1 | 0 | 高 | 差 | 简单查询(参数<2) |
param1, param2 | 1 | 高 | 中 | 需要明确编号的场景 |
@Param | 自定义 | 无 | 优 | 多参数/复杂业务场景 |
六、综合使用示例
6.1 混合使用场景
<select id="findComplex" resultType="Emp">SELECT * FROM emp WHERE salary >= #{min} AND salary <= #{param2} AND name LIKE #{arg2}
</select>
6.2 对应接口
List<Emp> findComplex(@Param("min") Double minSalary,Double maxSalary, String nameKeyword
);
七、最佳实践建议
- 参数超过 2 个时:必须使用 @Param 注解
- 涉及范围查询:建议使用 @Param 明确参数语义
- 维护性考量:优先选用 @Param 方式
- 版本兼容性:注意不同 MyBatis 版本对默认别名的支持差异