批量插入:
mysql
下批量插入的sql语句:1
2
3insert into user_info (uname,unumber) values
('xiaoyue1','1'),
('xiaoyue2','2');似乎很简单,
然而,经过复杂的条件判断和动态构造就变成了这样:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<insert id="insertMass" useGeneratedKeys="true" keyProperty="id">
insert into user_info
<trim prefix="(" suffixOverrides="," suffix=")">
<if test="list[0].id != null">id,</if>
<if test="list[0].uname!= null">uname,</if>
<if test="list[0].unumber!= null">unumber,</if>
</trim>
values
<foreach collection="list" item="item" index="index"
separator=",">
<trim prefix="(" suffixOverrides="," suffix=")">
<if test="item.id != null">#{item.id},</if>
<if test="item.uname!= null">#{item.uname},</if>
<if test="item.unumber!= null">#{item.unumber},</if>
</trim>
</foreach>
</insert>- 用
useGeneratedKeys
和keyProperty
接收自增主键返回的id,而且此处返回的是第一个插入的记录的id,而不是最后一条记录的id。注意调用代码传入的map
中必须有id
这一项以接收返回值。 - 用
trim
标签消除末尾的逗号,同时在首尾加上括号。 - 用
foreach
标签遍历传入的list
, 传入的map
中key
为list
的对象即为userInfo
数组。 list[0]
表示对象数组的第一项。
- 用
- 对应的调用代码:
1
2
3
4
5
6
7
8
9
10
11
12
public void insertMass(List<UserInfo> users) {
Map<String, Object> paraMap = new HashMap<>();
paraMap.put("list", users);
paraMap.put("id", 0);//note
userInfoMapper.insertMass(paraMap);
int beginId = (int) paraMap.get("id");
for (UserInfo userInfo : users) {
userInfo.setId(beginId);
++beginId;
}
}
- 批量更新:
本来是打算用case when
语句写的,然而太过复杂没能写出来,可能得用java
拼接好sql
语句再传给mybatis
;replace into
虽然简练但可能改变其他不想改变的字段;最后折中写了insert into..on duplicate key UPDATE...
。
1 | <insert id="updateMass"> <!--on duplicate key, mysql特有语法 --> |
- 这次没使用
trim
标签,可读性好了一点点,可以和上面对比一下; - 传入参数没设置类型,因为
mybatis
自己会判断, 其实类型是map
。map
中list
项中存着要更新的对象数组。