
一. 配置
首先,mysql需要數據庫連接配置&allowMultiQueries=true
jdbc.url=jdbc:mysql://mbp-mysql-xm01:5002/xmppsc?autoReconnect=true&useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true |
二. 批量操作
2.1. 事例
@Insert("insert into msg_inbox (`user_uid`,`pub_uid`,`msg_id`,`state`,`cts`,`uts`,`latest`,`source`) values " +
"<foreach collection='items' index='index' item='item' open='(' separator='),(' close=')'>" +
"#{item.user_uid},#{item.pub_uid},#{item.msg_id},#{item.state},#{item.cts},#{item.uts},#{item.latest},#{item.source}" +
"</foreach>")
void batchInsert(@Param("items")List<MsgInbox> items); |
@Update("update msg_inbox set latest=0 where (pub_uid,user_uid) in " +
"<foreach collection='items' index='index' item='item' open='((' separator='),(' close='))'>" +
"#{item.pub_uid},#{item.user_uid}" +
"</foreach> and latest=1")
void clearSessions(@Param("items")List<MsgInbox> items); |
@Update("<foreach collection='items' index='index' item='item' open='' separator=';' close=''>" +
"update article set uts=#{item.uts}, read_num=#{item.read_num} where hash=#{item.hash} and read_num < #{item.read_num}" +
"</foreach>")
void updateReadNumListNumByHash(@Param("items")List<Article> items); |
2.2. foreach
foreach的主要作用是在構建in條件中,它可以在SQL語句中進行迭代一個集合。
foreach元素的屬性主要有:collection,index,item,open,separator和close,意義如下:
| 詞 | 意義 |
|---|---|
| collection | 需要操作的集合 |
| index | 指定一個名字,用於表示在迭代過程中,每次迭代到的位置 |
| item | 表示集合中每一個元素進行迭代時的別名; |
| open | 表示該語句以什么開始 |
| separator | 表示在每次進行迭代之間以什么符號作為分隔符 |
| close | 表示以什么結束 |
在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:
1. 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list
2. 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array
3. 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在breast里面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key
三.注意
批量操作時,需要生成一段很長的操作語句,而語句過長時,會出現錯誤。
所以當有上萬條批量操作時,要注意這一點。
參考:mybatis批量操作
