Mybaitis foreach批量insert 以及配合 oracle merge into 函数,批量update和insert
oracle中相当于mysql的replace into函数:merge into
因为作者使用国产的神通数据库 写法与oracle相同 没办法使用mysql的replace into实现插入 使用merge into来代替 不太推荐使用这个 能不用尽量不用吧
使用方法
普通使用 xml中
<update id="mergeStudents" parameterType="com.alibaba.dto.StudentDTO">
merge into t_student a
using
(
SELECT
#{id} as id,
#{name} as name,
#{age} as age
FROM dual
) b
on (
a.id= b.id
)
when matched then
UPDATE SET
a.name= b.name,
a.age=b.age
when not matched then
INSERT(
a.id,
a.name,
a.age
) VALUES(
b.id,
b.name,
b.age
)
</update>
加上foreach
<update id="mergeStudents" parameterType="com.alibaba.dto.StudentDTO">
merge into t_student a
using
(
<foreach collection="stus" item="item" index="index" open=""
close="" separator="union all">
SELECT
#{item.id,jdbcType=VARCHAR} as id,
#{item.name,jdbcType=VARCHAR} as name,
#{item.age,jdbcType=VARCHAR} as age
FROM dual
</foreach>
) b
on (
a.id= b.id
)
when matched then
UPDATE SET
a.name= b.name,
a.age=b.age
when not matched then
INSERT(
a.id,
a.name,
a.age
) VALUES(
b.id,
b.name,
b.age
)
</update>
弊端:mybatis会报一个解析不了的语法错误 但不影响实际结果 解决办法暂未发现 com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'merge into 也算mybatis的bug吧 没有update与insert都兼容的标签
|