MyBatis 参数绑定

一、MyBatis 参数绑定机制

1.1 核心概念

当 Mapper 接口方法接收多个参数时,MyBatis 提供三种参数绑定方式:

  • 默认参数名arg0arg1(Java 8+)或 param1param2
  • @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
);

七、最佳实践建议

  1. 参数超过 2 个时:必须使用 @Param 注解
  2. 涉及范围查询:建议使用 @Param 明确参数语义
  3. 维护性考量:优先选用 @Param 方式
  4. 版本兼容性:注意不同 MyBatis 版本对默认别名的支持差异

你可能感兴趣的:(Java基础,mybatis)