以下语句实现MySQL批量插入更新功能。插入数据,如果数据库中主键已存在则更新on duplicate key update后的字段,主键不变。
<!-- 插入/更新设备列表 -->
<insert id="upsertDeviceList" parameterType="java.util.List">
insert into meeting_device_t
<trim prefix="(" suffix=")" >
uid, m_id, name,is_selected,is_delete,create_time,create_userid
</trim>
values
<foreach collection="list" item="item" index="index" separator=",">
<trim prefix=" (" suffix=")" suffixOverrides="," >
<choose>
<when test="item.uid !=null and item.uid != ''">
#{item.uid,jdbcType=VARCHAR},
</when>
<otherwise>
md5(uuid()),
</otherwise>
</choose>
#{item.mId,jdbcType=INTEGER},
#{item.name,jdbcType=VARCHAR},
#{item.isSelected,jdbcType=VARCHAR},
#{item.isDelete,jdbcType=VARCHAR},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.createUserid,jdbcType=VARCHAR},
</trim>
</foreach>
on duplicate key update
m_id= VALUES(m_id),
name=VALUES(name),
is_selected=VALUES(is_selected),
is_delete=VALUES(is_delete),
create_time=VALUES(create_time),
create_userid=VALUES(create_userid)
</insert>
on duplicate key update后面执行的更新语句用VALUES取值,因为这些字段在执行插入时已用#{}赋过值。
另外replace into 也可实现更新已存在的记录,但是表中定义的主键会变化。