致访客
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。
特此通知。
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。
特此通知。
概述
Mybatis使用insert记录时,如果使用ON DUPLICATE KEY UPDATE
无法获得记录的主键。
问题代码示例
<insert id="insertOrUpdate" parameterType="Example" useGeneratedKeys="true" keyProperty="id">
<include refid="insertSql"/>
ON DUPLICATE KEY UPDATE
count = #{count}
</insert>
insert时已经使用了useGeneratedKeys
和keyProperty
参数,但因为使用ON DUPLICATE KEY UPDATE
语句,insert后的影响行数为0,此时Mybatis不会将主键赋值给传入的对象,故插入记录后通过getId()
方法获取到的主键为null
解决方法
想要获得主键,则必须产生影响行。
解决方法是在表中添加一个更新时间
字段update_time
,进行insert时更新该字段,让其产生影响行,即可返回id。
<insert id="insertOrUpdate" parameterType="Example" useGeneratedKeys="true" keyProperty="id">
<include refid="insertSql"/>
ON DUPLICATE KEY UPDATE
update_time = NOW(),
count = #{count}
</insert>
注意:一定要用NOW()
函数而不是ON UPDATE CURRENT_TIMESTAMP
,否则依旧不会产生影响行