方法一
通过selectKey标签实现。主要作用是在插入数据之前或之后,查询主键的值。
selectKey的主要属性:
resultType:返回主键的类型
keyPropety:实体类对应主键的属性
order:如果是after,代表先插入,再执行selectKey中的sql。如果是before,则反之。
mapper.xml 示例:
<insert id="insertOrUpdate" parameterType="pd" >
<selectKey keyProperty="count" resultType="int" order="BEFORE">
select count(1) from table where ID= #{id}
</selectKey>
<if test="count > 0">
update table set a=#{a} WHERE ID=#{id}
</if>
<if test="count==0">
insert into table (id,a) values (#{id},#{a})
</if>
</insert>
方法二
利用数据库本身功能,MySQL中的”ON DUPLICATE KEY UPDATE“语法。
说明:INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。
mapper.xml示例:
<insert id="insertOrUpdate">
insert into base_person
(pname, idcard, gender, nation, source_flag, create_time)
values
<foreach collection="list" item="p" index="index" separator=",">
(#{p.pname},
#{p.idcard},
#{p.gender},
#{p.nation},
#{p.sourceFlag},
#{p.createTime})
</foreach>
ON DUPLICATE KEY UPDATE
pname=values(pname),
idcard=values(idcard),
gender=values(gender),
nation=values(nation)
</insert>