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

mybatis批量新增数据

数据量大的时候如果在循环中执行单条新增操作,是非常慢的。那么如何在mybatis中实现批量新增数据呢?

方法

insert 标签的 foreach 属性可以用于批量插入数据。您可以使用 foreach 属性遍历一个集合,并为集合中的每个元素生成一条插入语句。

<insert id="insertBatch" parameterType="list">insert into table_name (column1, column2)values<foreach collection="list" item="item" separator=",">(#{item.column1}, #{item.column2})</foreach>
</insert>

实战

表结构

我有一张表结构如下,为了好理解我把结构做了适当的精简:

create table exa_paper_question
(paper_id       bigint          not null comment '试卷编号',question_id    bigint          not null comment '试题编号'
)comment '试卷和试题关联表';

实体

public class ExaPaperQuestion
{private static final long serialVersionUID = 1L;/** 试卷编号 */private Long paperId;/** 试题编号 */private Long questionId;// getter setter 略}

maper.java

 /*** 批量新增试卷与试题的关系** @param list 试卷和试题关联集合*/public int batchAddQuestionToPage(List<ExaPaperQuestion> list);

mapper.xml

  <!--批量新增试卷与试题的关系 --><insert id="batchAddQuestionToPage" parameterType="list">insert into exa_paper_question (paper_id, question_id)values<foreach collection="list" item="item" separator=",">(#{item.paperId}, #{item.questionId})</foreach></insert>

业务调用处示例

 List<ExaPaperQuestion> list = new ArrayList<>();
for(Long id:questionIds){ExaPaperQuestion pq = new ExaPaperQuestion();pq.setPaperId(request.getPaperId());pq.setQuestionId(id);list.add(pq);}exaPaperQuestionMapper.batchAddQuestionToPage(list);

批量删除

上面是演示的批量新增,那就也能用到批量删除。

如果是有主键的表,批量删除格式如下:

  <delete id="deleteExaQuestionByQuestionIds" parameterType="String">delete from exa_question where question_id in<foreach item="questionId" collection="array" open="(" separator="," close=")">#{questionId}</foreach></delete>

如果是我示例中的这张表,是需要两个条件确实一条记录的,那么就这样写:

   <!--批量删除试卷与试题的关系 --><insert id="batchDeleteExaPaperQuestionByPaperId" parameterType="list">delete from exa_paper_questionwhere (paper_id, question_id) in (<foreach collection="list" item="item" separator=",">(#{item.paperId}, #{item.questionId})</foreach>)</insert>

其他的代码参考批量新增,几乎一致不在占用版面。

总结

稍作修改性能提升几十倍,非常的爽

http://www.lryc.cn/news/333133.html

相关文章:

  • webrtcP2P通话流程
  • 游戏引擎中的物理系统
  • 【C++ STL有序关联容器】map 映射
  • 【ZZULIOJ】1041: 数列求和2(Java)
  • C++【适配器模式】
  • go | 上传文件分析 | http协议分析 | 使用openssl 实现 https 协议 server.key、server.pem
  • Chatgpt掘金之旅—有爱AI商业实战篇|专业博客|(六)
  • 单例模式 JAVA
  • C++从入门到精通——初步认识面向对象及类的引入
  • GitHub入门与实践
  • centos 安装 stable-diffusion 详细流程
  • CSS编写登录框样式
  • Python|OpenCV-获取鼠标点击位置的坐标,并绘制图像(13)
  • 设计模式(14):命令模式
  • 关于阿里云云数据库自动扩缩容和自动SQL优化的20道面试题
  • mkcert生成ssl证书+nginx部署局域网内的https服务访问问题
  • PTA C 1050 螺旋矩阵(思路与优化)
  • 神经网络分类和回归任务实战
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 4 篇:串
  • 深入浅出 -- 系统架构之分布式多形态的存储型集群
  • STL —— list
  • 申请SSL证书
  • 深入浅出 -- 系统架构之负载均衡Nginx环境搭建
  • notepad++绿色版添加右键菜单
  • 7 个 iMessage 恢复应用程序/软件可轻松恢复文本
  • DockerFile启动jar程序
  • 基于R、Python的Copula变量相关性分析及AI大模型应用
  • 鸿蒙组件学习_Tabs组件
  • 【LangChain学习之旅】—(19)BabyAGI:根据气候变化自动制定鲜花存储策略
  • thinkphp6入门(21)-- 如何删除图片、文件