MySQL批量操作-笔记
一. 配置
首先,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批量操作