场景
在使用mybatis的过程中,有可能需要 insert into values on duplicate update的语法来进行操作,如果数据存在则更新,不存在则插入。
例子
- mybatis 代码如下
<insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
insert into ap_user_info( activity_id, user_id, user_reward_info, create_time, update_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.activityId}, #{entity.userId}, #{entity.userRewardInfo}, #{entity.createTime},
#{entity.updateTime})
</foreach>
on duplicate key update
activity_id = values(activity_id),
user_id = values(user_id),
user_reward_info = values(user_reward_info),
create_time = values(create_time),
update_time = values(update_time)
</insert>
- keyProperty 来指定一个唯一键(也可以是主键)用来给sql引擎判定是否插入还是更新,上述代码中指定为id,id为主键且自动生成
问题
- 不管执行sql时传入的数据是否id已经存在,都会执行插入操作
知识点
- keyProperty 指定的列
必须唯一
且不可以是自增生成
的,否则 on duplicate key update不起作用 - useGeneratedKeys 属性用来插入后给传入的对象赋自动生成的主键id值