错误示范
java代码设置了@param参数,但是sql 字段没有带上参数,例如
void insertV2(@Param("historyDO") HistoryDO historyDO);
<insert id="insertDuplicate" parameterType="com.test.entity.HistoryDO"
keyProperty="id" useGeneratedKeys="true">
keyProperty="id" 没有对象参数,导致主键id插入成功后不能自动赋值
正确示范
方式一
insert语句使用了@Param参数,全程在设置参数需要带上参数名称,代码如下
public interface HistoryMapper extends MyMapper<HistoryDO> {
void insertV2(@Param("historyDO") HistoryDO historyDO);
}
<insert id="insertDuplicate" parameterType="com.test.entity.HistoryDO"
keyProperty="historyDO.id" keyColumn="historyDO.id" useGeneratedKeys="true">
INSERT INTO history (
user_id,
status,
create_time,
create_time_zone,
update_time,
update_time_zone
)
VALUES
(
#{historyDO.userId},
#{historyDO.status},
#{historyDO.createTime},
#{historyDO.createTimeZone},
#{historyDO.updateTime},
#{historyDO.updateTimeZone}
)
ON DUPLICATE KEY UPDATE
status = VALUES(status),
id = LAST_INSERT_ID(id),
update_time = VALUES(update_time)
</insert>
注意 keyProperty="historyDO.id" 需要加上参数对象名称historyDO,
#{}参数也需要加上参数对象名称historyDO
方式二
insert语句不使用@Param参数,全程在设置参数需不需要带上参数名称,代码如下
public interface HistoryMapper extends MyMapper<HistoryDO> {
void insertV2(HistoryDO historyDO);
}
<insert id="insertV2" useGeneratedKeys="true" keyProperty="id">
INSERT INTO history (
user_id,
status,
create_time,
create_time_zone,
update_time,
update_time_zone
)
VALUES
(
#{userId},
#{status},
#{createTime},
#{createTimeZone},
#{updateTime},
#{updateTimeZone}
)
</insert>