一、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 版本对默认别名的支持差异
到此这篇关于mybatis 参数绑定的具体实现的文章就介绍到这了,更多相关mybatis 参数绑定内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论