mybatis foreach標籤的使用

2022-07-24 19:21:08 字數 2482 閱讀 4179

下面是foreach標籤的各個屬性

屬性描述

collection

表示迭代集合的名稱,可以使用@param註解指定,如下圖所示

該引數為必選

item

表示本次迭代獲取的元素,若collection為list、set或者陣列,則表示其中的元素;若collection為map,則代表key-value的value,該引數為必選

open

表示該語句以什麼開始,最常用的是左括弧』(』,注意:mybatis會將該字元拼接到整體的sql語句之前,並且只拼接一次,該引數為可選項

close

表示該語句以什麼結束,最常用的是右括弧』)』,注意:mybatis會將該字元拼接到整體的sql語句之後,該引數為可選項

separator

index

在list、set和陣列中,index表示當前迭代的位置,在map中,index代指是元素的key,該引數是可選項。

假設介面中傳遞的list如下所示:

listlist = new arraylist<>();

list.add("zhangsan");

list.add("lisi");

list.add("wangwu");

其中foreach標籤配置如下:

(#)

可以看到的是foreach標籤指定了逗號作為分隔符,那麼mybatis將會解析出foreach標籤裡面的內容作為乙個整體然後再其後面拼接上逗號分隔符,拼接後的過程如下所示:

('zhangsan')                         //

第一步,迭代集合,獲取對應的item,和外部的(),拼接形成('zhangsan')

('zhangsan'), //

第二步,在之前的基礎上拼接上逗號分隔符

('zhangsan'),('lisi') //

第三步,繼續迭代

('zhangsan'),('lisi'), //

第四步,拼接逗號分隔符

('zhangsan'),('lisi'),('wangwu') //

第五步,迭代集合並拼接,到此迭代結束

最終的結果為

('zhangsan'),('lisi'),('wangwu')
如果在foreach標籤前面加上insert into table values,將會變形成

insert into user(user_name) values('zhangsan'),('lisi'),('wangwu')
這種形式一般用於資料庫的批量增加。

如果將foreach配置修改如下,指定open屬性為左括弧,close屬性為右括弧:

#

那麼拼接的過程如下所示

(                               //

第一步,拼接open指定的開始字元

('zhangsan' //

第二步,迭代集合,拼接對應的item

('zhangsan', //

第三步,拼接separator指定的分隔符

('zhangsan','lisi' //

第四步,迭代集合,拼接對應的item

('zhangsan','lisi', //

第五步,拼接separator指定的分隔符

('zhangsan','lisi','wangwu' //

第六步,迭代集合,拼接對應的item

('zhangsan','lisi','wangwu') //

第七步,拼接close指定的閉合字元

最終結果是:

('zhangsan','lisi','wangwu')
如果在foreach標籤前面加上select … from table where … in ,將會變形成

select * from user where user_name in ('zhangsan','lisi','wangwu')
這種形式被用來構建in條件語句。

如果collection型別為map,則index代表key,item代表對應的value,可以這樣進行批量插入:

其中role實體類如下:

本文參考mybatis官方文件

Mybatis foreach 效能問題

這裡先不考慮使用 in 好不好,如何去優化 in,如何使用 exists 或 inner join 進行代替等,這裡就只是考慮使用了 in 語句,且使用了 mybatis 的 foreach 語句進行優化,其實 foreach 的優化很簡單,就是把 in 後面的語句在 裡面拼接好,在配置檔案中直接通...

mybatis foreach 用法總結

1.findbyids listids 傳入引數為單一list引數時的寫法 2.findbyids integer ids 傳入引數為單一陣列時的寫法 3.search integer ids,string title 傳入引數為多個型別的查詢條件時 mapparams new hashmap pa...

MyBatis foreach 批量插入

1.批量插入 insert into student id,name,classid values null,null,null,insert id insertmore insert into student id,name,classid values foreach collection li...