首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

MyBatis 參數傳遞完全指南:單參、多參、對象、List 與 @Param 最佳實踐

     編輯:Java 綜合教學

前言

MyBatis 映射文件中 #{...} 參數綁定規則靈活但易混淆。本文系統整理單參數、多參數、複雜對象、List 集合等場景的正確寫法,並給出統一推薦規範。

一、單個參數

1. 基礎類型(String、Integer、Long 等)

直接使用:參數名任意,#{任意名} 均可(建議與方法參數名一致)。

// Mapper
List<User> selectById(Long id);

// XML
SELECT * FROM user WHERE id = #{id}

@Param 顯式命名:@Param("uid") Long id → XML 用 #{uid}。推薦:所有公開介面均加 @Param,避免編譯參數名丟失(未加 -parameters 時)。

2. 複雜對象(POJO/DTO)

直接使用:#{屬性名} 自動映射對象屬性。

// Mapper
List<User> selectByCondition(UserQuery query);

// XML
SELECT * FROM user 
WHERE name = #{name} AND age > #{age}

@Param 包裝:@Param("q") UserQuery query → XML 必須 #{q.name}、#{q.age},不可簡寫#{name}。

二、多個參數

1. 僅基礎類型

不加 @Param(不推薦):依賴編譯器保留參數名(需 javac -parameters),XML 用 #{param1}、#{param2} 或 #{0}、#{1}(索引從 0 開始)。

加 @Param(強烈推薦):

// Mapper
List<User> select(@Param("name") String name, @Param("age") Integer age);

// XML
SELECT * FROM user WHERE name = #{name} AND age = #{age}

2. 含複雜對象

規則:複雜對象必須加 @Param,基礎類型建議同步加 @Param。

// Mapper
List<User> select(@Param("q") UserQuery q, @Param("status") Integer status);

// XML
SELECT * FROM user 
WHERE name = #{q.name} AND age > #{q.age} AND status = #{status}

錯誤示範:UserQuery q, Integer status(無 @Param)→ MyBatis 無法區分,會報錯或綁定錯誤。

3. 基礎類型 + 複雜對象混合

// Mapper
List<User> select(@Param("id") Long id, @Param("q") UserQuery q);

// XML
WHERE id = #{id} AND name = #{q.name}

三、List/集合參數

1. 單純 List<基礎類型>

// Mapper
List<User> selectByIds(@Param("ids") List<Long> ids);

// XML
SELECT * FROM user WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
    #{id}
</foreach>

collection 屬性值 = @Param 值(此處 "ids")。

2. List<對象>

// Mapper
int batchInsert(@Param("users") List<User> users);

// XML
INSERT INTO user (name, age) VALUES
<foreach collection="users" item="u" separator=",">
    (#{u.name}, #{u.age})
</foreach>

四、@Param 使用總結表

場景是否必加 @ParamXML 寫法備註
單基礎類型建議加#{paramName}防參數名丟失
單複雜對象可不加#{prop}加了則需 #{param.prop}
多基礎類型必加#{paramName}否則靠索引/編譯參數名,極不穩
多參數含對象必加(對象)#{param.prop} / #{paramName}基礎類型同步加 @Param 更清晰
List/集合必加collection="paramName"foreach 依賴 collection 名稱

五、最佳實踐建議

  1. 公開 Mapper 介面所有參數統一加 @Param,語義明確、重構安全、不依賴編譯選項。
  2. 參數名採用駝峰命名,與 Java 屬性、資料庫欄位風格一致。
  3. 複雜查詢封裝為單一 Query Object,減少多參數傳遞,XML 內直接 #{q.xxx}。
  4. 批量操作用 List<Object> + foreach,避免拼接 SQL 字串防注入。
  5. 啟用 mapUnderscoreToCamelCase=true,資料庫下劃線自動映射駝峰屬性。

六、常見坑點速查

  • #{param} 找不到值 → 檢查 @Param 拼寫、編譯是否保留參數名。
  • foreach 報 Collection not found → collection 屬性必須等於 @Param 值,而非 Java 參數變數名。
  • 對象屬性為 null 導致 WHERE 條件失效 → 使用 <if test="q.name != null"> 動態 SQL。

遵循「統一 @Param、單一 Query Object、foreach 綁定 collection」三原則,可消除 90% 以上 MyBatis 參數綁定問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved