【Easylive】MyBatis 批量插入或更新语句解析insertOrUpdateBatch
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版
这段代码是一个 MyBatis 的 Mapper XML 配置,实现了批量插入或更新视频文件信息的功能。下面详细解析这个 SQL 语句的各个部分:
1. 基本结构
<insert id="insertOrUpdateBatch" parameterType="com.easylive.entity.po.VideoInfoFilePost">
INSERT INTO video_info_file_post(...) VALUES (...)
ON DUPLICATE KEY UPDATE ...
</insert>
这是一个典型的 MyBatis 批量操作语句,使用了 MySQL 的 INSERT ... ON DUPLICATE KEY UPDATE
语法。
2. 插入部分详解
INSERT INTO video_info_file_post(
file_id,
upload_id,
user_id,
video_id,
file_index,
file_name,
file_size,
file_path,
update_type,
transfer_result,
duration
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.fileId},
#{item.uploadId},
#{item.userId},
#{item.videoId},
#{item.fileIndex},
#{item.fileName},
#{item.fileSize},
#{item.filePath},
#{item.updateType},
#{item.transferResult},
#{item.duration}
)
</foreach>
关键点:
• <foreach>
标签:MyBatis 的循环标签,用于处理集合
• collection="list"
:表示参数是一个 List 集合
• item="item"
:定义循环变量名
• separator=","
:每次循环后用逗号分隔
• #{}
表达式:MyBatis 的参数占位符,会预编译防止 SQL 注入
• 使用 item.属性名
访问集合元素的属性
3. 冲突更新部分详解
ON DUPLICATE KEY UPDATE
file_index = VALUES(file_index),
file_name = VALUES(file_name)
关键点:
• ON DUPLICATE KEY UPDATE
:MySQL 特有语法,当主键或唯一键冲突时执行更新
• VALUES()
函数:引用 INSERT 语句中尝试插入的值
• 这里只更新了 file_index
和 file_name
两个字段,其他字段保持不变
4. 完整逻辑流程
- 尝试批量插入多条记录到
video_info_file_post
表 - 如果某条记录的
file_id
(假设是主键)已存在,则执行更新操作 - 更新时只修改
file_index
和file_name
字段 - 其他字段保持原值不变
5. 实际执行示例
假设传入的 List 包含两个元素:
List<VideoInfoFilePost> list = Arrays.asList(
new VideoInfoFilePost("id1", "up1", "user1", "vid1", 1, "name1", 100, "path1", 0, 0, 100),
new VideoInfoFilePost("id2", "up2", "user1", "vid1", 2, "name2", 200, "path2", 0, 0, 200)
);
生成的 SQL 语句类似:
INSERT INTO video_info_file_post(
file_id, upload_id, user_id, video_id, file_index, file_name,
file_size, file_path, update_type, transfer_result, duration
) VALUES
('id1', 'up1', 'user1', 'vid1', 1, 'name1', 100, 'path1', 0, 0, 100),
('id2', 'up2', 'user1', 'vid1', 2, 'name2', 200, 'path2', 0, 0, 200)
ON DUPLICATE KEY UPDATE
file_index = VALUES(file_index),
file_name = VALUES(file_name)
6. 设计考虑
- 性能优化:批量操作减少数据库往返次数
- 原子性:整个操作在一个事务中完成
- 灵活性:只更新需要变更的字段
- 幂等性:重复执行不会产生副作用
7. 使用场景
这种批量插入或更新操作特别适合:
• 初始化数据
• 批量导入
• 数据同步
• 需要处理大量记录的定时任务
8. 注意事项
- 确保表有主键或唯一键约束,否则
ON DUPLICATE KEY UPDATE
不会生效 - 大批量操作时可能需要分批处理,避免单条 SQL 过大
- 在高并发环境下注意锁竞争问题