当前位置: 首页 > news >正文

【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_indexfile_name 两个字段,其他字段保持不变

4. 完整逻辑流程

  1. 尝试批量插入多条记录到 video_info_file_post
  2. 如果某条记录的 file_id(假设是主键)已存在,则执行更新操作
  3. 更新时只修改 file_indexfile_name 字段
  4. 其他字段保持原值不变

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. 设计考虑

  1. 性能优化:批量操作减少数据库往返次数
  2. 原子性:整个操作在一个事务中完成
  3. 灵活性:只更新需要变更的字段
  4. 幂等性:重复执行不会产生副作用

7. 使用场景

这种批量插入或更新操作特别适合:
• 初始化数据
• 批量导入
• 数据同步
• 需要处理大量记录的定时任务

8. 注意事项

  1. 确保表有主键或唯一键约束,否则 ON DUPLICATE KEY UPDATE 不会生效
  2. 大批量操作时可能需要分批处理,避免单条 SQL 过大
  3. 在高并发环境下注意锁竞争问题

相关文章:

  • 12.小节
  • 关于React Redux
  • 【3. 软件工程】3.0 软件工程概述
  • Android View事件分发机制深度解析
  • QuecPython 的 VScode 环境搭建和使用教程
  • IS-IS认证
  • MySQL日志管理
  • NVR接入录像回放平台EasyCVR视频融合平台城市/乡镇污水处理厂解决方案
  • 计算机等级考试数据库三级(笔记2)
  • 032-overlayYUV
  • 深入解析Kapt —— Kotlin Annotation Processing Tool 技术博客
  • 使用 Portainer 轻松管理 Docker 环境:完整安装与使用指南
  • MD编辑器中的段落缩进怎么操作
  • 链路追踪Skywalking
  • QT实现四则运算计算器(QT实操1)
  • 多台服务器上docker部署 Redis 集群
  • Spring Boot @RequestParam 解析参数时的常见问题及解决方案
  • linux基本命令(2)--进程命令PS
  • Linux更换挂载nfs迁移数据流程
  • 使用AOP技术实现Java通用接口验签工具
  • 体验中国传统文化、采购非遗文创,波兰游客走进上海市群艺馆
  • 重庆大学:对学术不端行为“零容忍”,发现一例、查处一例
  • 庆祝上海总工会成立100周年暨市模范集体劳动模范和先进工作者表彰大会举行,陈吉宁寄予这些期待
  • 代理销售保险存在误导行为,农业银行重庆市分行相关负责人被罚款0.1万元
  • 七大交响乐团在沪“神仙斗法”,时代交响奏出何等时代新声
  • 上海交大:关注到对教师邵某的网络举报,已成立专班开展调查