mybatis 批量新增时,有重复数据直接覆盖如:
<insert id="batchSaveOrUpdateMonthBuilding" parameterType="java.util.List" useGeneratedKeys="true">
<selectKey resultType="long" keyProperty="id" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into excel_month_building
(
id,
data_company_id,
statistics_month,
building_id,
building_name,
tenant_name,
rental_area,
daliy_rental,
annual_rental,
security_deposit,
contract_period,
invoice_date,
rent_remind_remark,
create_user,
create_time,
modified_user,
modified_time
)
values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id},
#{item.dataCompanyId},
#{item.statisticsMonth},
#{item.buildingId},
#{item.buildingName},
#{item.tenantName},
#{item.rentalArea},
#{item.daliyRental},
#{item.annualRental},
#{item.securityDeposit},
#{item.contractPeriod},
#{item.invoiceDate},
#{item.rentRemindRemark},
#{item.createUser},
#{item.createTime},
#{item.modifiedUser},
#{item.modifiedTime}
)
</foreach>
ON DUPLICATE KEY UPDATE
building_name = values (building_name),
rental_area = values (rental_area),
daliy_rental = values (daliy_rental),
annual_rental = values (annual_rental),
security_deposit = values (security_deposit),
contract_period = values (contract_period),
invoice_date = values (invoice_date),
rent_remind_remark = values (rent_remind_remark),
modified_user = values (modified_user),
modified_time = values (modified_time)
</insert>
1. ON DUPLICATE KEY UPDATE函数作用:
ON DUPLICATE KEY UPDATE
building_name = values (building_name),
rental_area = values (rental_area),
...
这部分是处理插入操作中遇到重复键的关键。当MySQL尝试插入一个具有唯一键(如主键或具有UNIQUE约束的列)的记录时,如果此键的值已存在,则不会插入新记录,而是更新该键对应的现有记录。
ON DUPLICATE KEY UPDATE子句列出了要更新的列和它们的新值。在这里,新值是从VALUES()函数中获取的,该函数返回在INSERT语句中指定的值。
2.覆盖的前提时你数据库表设置有唯一值,如:
UNIQUE KEY statistics_unique_key
(statistics_month
,building_id
,tenant_name
) USING BTREE COMMENT '统计年月维度及楼宇(唯一键)'我设置了statistics_month
,building_id
,tenant_name
这三个字段,如果重复就覆盖不重复则新增。
<selectKey resultType="long" keyProperty="id" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
这段代码是在插入操作之后获取MySQL生成的最后一个插入的ID。LAST_INSERT_ID()是一个MySQL函数,返回最近一个INSERT或UPDATE操作产生的AUTO_INCREMENT值。这个值通常用于填充Java对象的id属性。