Mybatis的七種傳參方式示例全解析
MyBatis 的 7 種傳參方式詳解
1. 順序傳遞參數(shù)
通過方法參數(shù)的排列順序進行傳參,適用于多個簡單類型參數(shù)。需注意在 XML 映射文件中必須按照參數(shù)順序使用 #{arg0}、#{arg1} 或 #{param1}、#{param2} 等形式引用。
Controller 層示例:
@ApiOperation(value = "多個參數(shù)查詢_匿名順序傳參")
@GetMapping("findByParams")
public ResultMsg findByParams(Short gender, String age) {
List result = employeeMapper.selectByGenderAndAge(gender, age);
return ResultMsg.getMsg(result);
}
Mapper 接口:
List<Employee> selectByGenderAndAge(Short gender, String age);
XML 映射配置(關鍵點:使用 param1、param2 按順序引用):
<select id="selectByGenderAndAge" resultMap="BaseResultMap">
SELECT * FROM employee WHERE gender = #{param1} AND age = #{param2}
</select>?? 注意:參數(shù)索引從 param1 開始,param1 對應第一個參數(shù),param2 對應第二個。
2. 使用 @Param 注解命名傳參
為解決順序傳參可讀性差的問題,可在 Mapper 接口中使用 @Param 注解為每個參數(shù)指定名稱,使 XML 中可通過語義化名稱訪問。
Mapper 接口修改:
List<Employee> selectByGenderAndAge(@Param("gender") Short gender, @Param("age") String age);
XML 映射文件(推薦寫法,清晰直觀):
<select id="selectByGenderAndAge" resultMap="BaseResultMap">
SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>
</select>? 優(yōu)勢:代碼可讀性強,避免因參數(shù)順序錯誤導致的 SQL 異常。
3. 使用 Map 傳遞多個參數(shù)
將多個參數(shù)封裝成 Map<String, Object>,以鍵值對形式傳遞,適合參數(shù)較多或動態(tài)條件場景。
Controller 層封裝 Map:
@ApiOperation(value = "多個參數(shù)查詢_通過Map傳遞多個參數(shù)")
@GetMapping("findByMapParams")
public ResultMsg findByMapParams(Short gender, String age) {
Map<String, Object> params = new HashMap<>();
params.put("gender", gender);
params.put("age", age);
List result = employeeMapper.selectByMapParams(params);
return ResultMsg.getMsg(result);
}
XML 配置說明:
<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>? 說明:parameterType="map" 可省略,MyBatis 默認支持 Map 傳參;通過 #{key} 直接取值。
4. 使用 Java Bean 對象傳參
當參數(shù)結構固定且與實體類一致時,推薦使用 Java Bean,Controller 層通過 @RequestBody 接收 JSON 數(shù)據(jù)并直接傳遞給 Mapper。
Controller 層接收對象:
@ApiOperation(value = "多個參數(shù)查詢_通過Java Bean傳遞多個參數(shù)")
@PostMapping("findByBeans")
public ResultMsg findByBeans(@RequestBody Employee employee) {
List result = employeeMapper.selectByBeans(employee);
return ResultMsg.getMsg(result);
}
XML 映射配置:
<select id="selectByBeans" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Employee">
SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>? 優(yōu)勢:結構清晰,自動映射屬性,適合復雜對象查詢。
5. 使用 JSON 對象直接傳參
利用 JSONObject 接收任意結構的 JSON 數(shù)據(jù),無需定義實體類,靈活性高,適用于動態(tài)查詢場景。
Controller 層處理 JSON:
@ApiOperation(value = "多個參數(shù)查詢_通過JSON傳遞多個參數(shù)")
@PostMapping("findByJSONObject")
public ResultMsg findByJSONObject(@RequestBody JSONObject params) {
List result = employeeMapper.findByJSONObject(params);
return ResultMsg.getMsg(result);
}
XML 配置與 Java Bean 類似:
<select id="findByJSONObject" resultMap="BaseResultMap" parameterType="com.alibaba.fastjson.JSONObject">
SELECT * FROM employee WHERE gender = #{gender} AND age = #{age}
</select>
</select>? 適用場景:快速開發(fā)、原型驗證、字段不固定的接口。
6. 集合類型傳參(List、Set、Array)
當需要根據(jù)集合進行 IN 查詢時,可直接傳遞集合對象,配合 <foreach> 標簽遍歷處理。
Controller 層接收集合:
@ApiOperation(value = "多個參數(shù)查詢_通過List、Set、Array傳遞多個參數(shù)")
@PostMapping("findByList")
public ResultMsg findByList(@RequestBody List<String> list) {
List result = employeeMapper.findByList(list);
return ResultMsg.getMsg(result);
}
XML 使用 <foreach> 構建 IN 條件:
<select id="findByList" resultMap="BaseResultMap">
SELECT * FROM employee WHERE age IN
<foreach collection="list" item="age" open="(" separator="," close=")">
#{age}
</foreach>
</select>?? 說明:
collection="list":默認參數(shù)名;item:循環(huán)變量名;open/close:包裹符號;separator:分隔符。
7. 對象中包含集合屬性的傳參
用于處理嵌套結構數(shù)據(jù),如部門對象包含員工列表,可在對象內部使用集合,并在 XML 中通過 OGNL 表達式訪問集合屬性。
Controller 層接收復合對象:
@ApiOperation(value = "多個參數(shù)查詢_對象+集合參數(shù)")
@PostMapping("findByDepartment")
public ResultMsg findByDepartment(@RequestBody Department department) {
List result = employeeMapper.findByDepartment(department);
return ResultMsg.getMsg(result);
}
Mapper 接口需配合 @Param 指定別名:
List<Employee> findByDepartment(@Param("department") Department department);
XML 中通過 OGNL 訪問對象內集合:
<select id="findByDepartment" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Department">
SELECT * FROM employee
WHERE dept_id = #{department.id}
AND age IN
<foreach collection="department.employees" item="employee" open="(" separator="," close=")">
#{employee.age}
</foreach>
</select>
</select>? 技巧:使用 @Param 可提升 OGNL 表達式的可讀性和穩(wěn)定性。
?? 總結建議:
- 參數(shù)少且簡單 → 使用
@Param; - 參數(shù)多或結構固定 → 使用 Java Bean;
- 動態(tài)字段或快速開發(fā) → 使用
Map或JSONObject; - 涉及
IN查詢 → 必須使用<foreach>配合集合; - 復雜嵌套結構 → 結合
@Param與 OGNL 表達式訪問對象屬性。
合理選擇傳參方式,可顯著提升代碼可維護性與 SQL 安全性。
到此這篇關于Mybatis的七種傳參方式示例全解析的文章就介紹到這了,更多相關Mybatis傳參方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中zip文件壓縮與解壓之ZipInputStream和ZipOutputStream
這篇文章主要給大家介紹了關于Java中zip文件壓縮與解壓之ZipInputStream和ZipOutputStream的相關資料,ZipInputStream 和 ZipOutputStream 可以用于處理 ZIP文件格式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-10-10

