Mybatis foreach 填充 Merge into

一、merge into语句的语法以及解析

MERGE INTO schema.table alias
USING { schema. table | views | query} alias
ON {(condition) }
WHEN MATCHED THEN
  UPDATE SET {clause}
WHEN NOT MATCHED THEN
  INSERT VALUES {clause};

参数介绍:

INTO 子句
        用于指定你所update或者Insert目的表。
USING 子句
        用于指定你要update或者Insert的记录的来源,它可能是一个表,视图,子查询。
ON Clause
        用于目的表和源表(视图,子查询)的关联,如果匹配(或存在),则更新,否则插入。
merge_update_clause 
        用于写update语句
merge_insert_clause
        用于写insert语句

二、Mybatis foreach的使用

<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">

参数值的使用

</foreach>

foreach 标签主要有以下属性,说明如下。

  1. item:表示集合中每一个元素进行迭代时的别名。
  2. index:指定一个名字,表示在迭代过程中每次迭代到的位置。
  3. open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
  4. separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
  5. close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。


collection 属性,是必选的,主要有以下 3 种情况:

  1. 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
  2. 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
  3. 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

三、demo

数据来源是一个List<Object>,先将所有数据加载到一个临时表dual中,再去与目标表进行主键比较;主键冲突则更新,否则插入;

<insert id="saveTableList" parameterType="com.example.test.beans">
	MERGE INTO TABLENAME A USING (
	<foreach collection="paramList" item="item" separator="union all"
		SELECT 
			#{item.paramName} AS PARAM_NAME,
			#{item.paramValue} AS PARAM_VALUE,
			#{item. paramType} AS PARAM_TYPE 
			FRON dual B
	</foreach>
	)C 
	ON (A.PARAM_NAME = C.PARAM_NAME AND A.PARAM_TYPE = C.PARAM_TYPE)
	WHEN MATCHED THEN
		UPDATE
			SET A.PARAM_VALUE= C.PARAM_VALUE
	WHEN NOT MATCHED THEN
		INSERT 
			(A.PARAM_NAME,A.PARAM_VALUE,A.PARAM_TYPE )
		VALUES
			(C.PARAM_NAME,C.PARAM_VALUE,C.PARAM_TYPE )
</insert>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值