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

MyBatis foreach 遍歷 Map/List 正確寫法與常見坑

     編輯:程式設計綜合問答

問題場景

Mapper XML 中使用 <foreach> 遍歷參數,傳入實體類別正常,改傳 Map 或 List<Map> 後無法取值。

核心規則

  • collection 屬性值必須為參數名稱(或參數對象內的屬性名),不是 Java 型別名稱。
  • item 代表迴圈當前元素,index 為索引。
  • 元素為 Map 時,用 #{item.key} 取值;元素為實體時,用 #{item.property}。

參數傳遞與 XML 對應表

Java 參數collection 值item 取值方式
List<User> userscollection="users"#{item.id}, #{item.name}
List<Map> listcollection="list"#{item.keyName}
Map<String, List<User>> map key="userList"collection="userList"#{item.id}
@Param("ids") List<Long> idscollection="ids"#{item} (基本型別直接用 item)
單一 Map 參數(無 @Param)collection="map.key" 或直接用 key視 Map value 型別而定

正確範例:批次插入 List<Map>

<insert id="batchInsert" parameterType="java.util.List">
  INSERT INTO t_user (name, age, email)
  VALUES
  <foreach collection="list" item="item" index="idx" separator=",">
    (#{item.name}, #{item.age}, #{item.email})
  </foreach>
</insert>

Java 呼叫:

List<Map<String, Object>> list = new ArrayList<>();
list.add(Map.of("name", "A", "age", 18, "email", "a@x.com"));
list.add(Map.of("name", "B", "age", 20, "email", "b@x.com"));
mapper.batchInsert(list); // 參數名即為 "list"(單一參數時 MyBatis 自動以 "list"/"collection" 綁定)

常見錯誤與修正

錯誤寫法問題修正
collection="java.util.List"寫了型別名稱,非參數名collection="list" 或 collection="paramName"
#{item.get('key')}OGNL 不支援 Map.get()#{item.key}
單一 Map 參數未加 @ParamMyBatis 以 "map"/"parameter" 綁定,易混淆加 @Param("myMap"),XML 用 collection="myMap.keyList"
foreach 缺少 separator=","SQL 語法錯誤(值之間無逗號)必加 separator=","

進階:動態表名/欄名(不建議常用)

<foreach collection="list" item="t" separator=";">
  INSERT INTO ${t.tableName} (col1) VALUES (#{t.val})
</foreach>

${...} 為直接字串替換(有 SQL 注入風險),僅用於受信任的內部參數(如代碼生成階段)。

除錯技巧

  1. 開啟 MyBatis 日誌:logging.level.org.apache.ibatis=DEBUG,查看實際 SQL 與參數綁定。
  2. 在 XML 加入 <bind name="debug" value="@java.lang.System@out.println('item=' + item)" /> 列印迴圈變數。
  3. 使用 SqlSessionFactoryBuilder 單元測試,斷點檢查 BoundSql。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved