mybatis

merge into 能够以一次请求实现 类似于insertOrUpdate的操作。减少请求次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

<insert id="insertOrUpdate" parameterType="ArrayList">
merge into P_MAP_TENANT_USER r using
(
<foreach collection="pMapTenantUsers" index="index" item="item" open="" close="" separator="union">
select
#{item.tenantId} as TENANT_ID,
#{item.userId} as USER_ID,
#{item.roleType} as ROLE_TYPE
from dual
</foreach>
)tmp
on (
tmp.TENANT_ID = r.TENANT_ID
and tmp.USER_ID = r.USER_ID
)
when matched THEN
update
<set>
r.ROLE_TYPE = tmp.ROLE_TYPE,
</set>
when not matched THEN
insert
<trim prefix="(" suffix=")" suffixOverrides="," >
TENANT_ID ,
USER_ID ,
ROLE_TYPE
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
tmp.TENANT_ID,
tmp.USER_ID,
tmp.ROLE_TYPE
</trim>
</insert>

merge into clause

需要被更新的表

using clause

新增或者更新的数据源。

on clause

指定条件,只有满足条件的行会被更新和替换

update clause

标准的 update 参数,需要注意的是,set 参数里不能出现 on clause 出现的 参数

insert clause

标准的 insert 参数