一、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 版本對默認別名的支持差異