前言
MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE
语句不仅适用于单行数据的操作,也可以用于处理批量插入并根据唯一键更新已有记录的情况。结合MyBatis框架,可以高效地实现这一功能。
一、MyBatis中的批量插入与更新示例
假设我们有一个包含部门信息的实体类SysDept
,其属性包括deptId
(主键),parentId
,ancestors
,deptName
,orderNum
,status
,delFlag
,createTime
和updateTime
。现在需要在一个映射文件中定义一个名为replaceInto
的方法来批量插入或更新这些部门信息:
<insert id="replaceInto">
INSERT INTO sys_dept(
dept_id,
parent_id,
ancestors,
dept_name,
order_num,
status,
del_flag,
create_time,
update_time)
VALUES
<foreach collection="deptList" item="item" separator=",">
(#{item.deptId},
#{item.parentId},
#{item.ancestors},
#{item.deptName},
#{item.orderNum},
#{item.status},
#{item.delFlag},
#{item.createTime},
#{item.updateTime})
</foreach>
ON DUPLICATE KEY UPDATE
parent_id=VALUES(parent_id),
ancestors=VALUES(ancestors),
dept_name=VALUES(dept_name),
order_num=VALUES(order_num),
status=VALUES(status),
del_flag=VALUES(del_flag),
create_time=VALUES(create_time),
update_time=VALUES(update_time);
</insert>
在这个例子中:
deptList
是传入Mapper方法的参数,它是一个包含了多个SysDept
对象的列表。<foreach>
标签用于遍历deptList
,将每个对象的属性值插入到SQL语句中。dept_id
(主键)时,ON DUPLICATE KEY UPDATE子句会自动更新相应的列值。二、调用示例
List<SysDept> deptList = new ArrayList<>();
// 假设已经填充了deptList数据...
sysDeptMapper.replaceInto(deptList);
通过这种方式,无论传入的部门列表中有多少条记录,无论是新记录还是已存在的记录,都能确保数据的一致性和完整性,并且有效地执行了一次性插入或更新所有部门信息的操作。
总结来说,在处理大量数据的批量插入与更新场景下,MySQL的ON DUPLICATE KEY UPDATE
配合MyBatis的动态SQL,能够简化编程逻辑,提高数据处理效率。同时,这个示例也展示了如何在实体类驼峰命名法与数据库表字段下划线命名法之间灵活转换。在实际应用时,请确保对数据库表结构和实体类属性保持一致的命名约定。