通过Mybatis批量插入表数据

news/2024/11/15 21:27:17/

对于需要同时插入大量表数据的需求,我们可以通过下述方式实现:

for(Commit commit: commitList){commitDao.insertCommit(commit);}

但我们很快就会发现系统效率低下。插入2000条数据大概花了4mins。
在思考如何提速的过程中,首先想到的就是如何进行batchInsert!

commitDao.batchInsertCommit(commitList);

那怎么做呢?其实很简单,但需要注意细节。
常规的,我们需要写好dao,mapper以及xml,demo分别如下:

    public void batchInsertCommit(List<Commit> commitList) {commitMapper.batchInsertCommit(commitList);}
void batchInsertCommit(@Param("commitList") List<Commit> commitList);
    <insert id="batchInsertCommit" parameterType="List">INSERT INTO commit(commit_id,message,developer,commit_time,repo_uuid,developer_email,self_index,parent_commit)VALUES<foreach collection="commitList" item="c" separator=",">(#{c.commit_id},#{c.message},#{c.developer},#{c.commit_time},#{c.repo_uuid},#{c.developer_email},#{c.self_index},#{c.parent_commit})</foreach></insert>

上述代码是正常可以工作的,但是在实现这个版本之前,我犯了一些错误。
系统报错如下:

"msg": "failure nested exception is org.apache.ibatis.binding.BindingException: Parameter 'uuid' not found. Available parameters are [commitList, param1]","data": null }

原以为是在主键自增的情况下,可能不支持多条value的添加。但通过实际的sql证明了这一点是可行的。

需要注意的点如下:

  1. 关于批量insert,demo如上。必须在values内部,通过集合的item指定value,比如c.commit_id,没有引用则会报错找不到commit_id。
  2. 另一方面是,在mapper.java中也一定要对方法参数进行@Param(“paramName”)的修饰,不然也会显示找不到该参数。

性能测试:

测试方法

long stime = System.currentTimeMillis();
// insesrt 操作
long etime = System.currentTimeMillis();

发现single insert分别耗时: 103670,106130,100602 ms
batch insert耗时: 3557, 1517,1047,1814,1551,1235 ms

性能得到极大提升!

总结:
系统的性能瓶颈很大情况下不取决于硬件,使用sql的方式带来的性能差异极大,需要注意!


http://www.ppmy.cn/news/717139.html

相关文章

MyBatis批量插入的五种方式,哪种最强?

前言 这里列举了MyBatis和MyBatis-Plus常用的五种批量插入的方式&#xff0c;进行了详细的总结归纳。 准备工作MyBatis利用For循环批量插入MyBatis的手动批量提交MyBatis以集合方式批量新增&#xff08;推荐&#xff09;MyBatis-Plus提供的SaveBatch方法MyBatis-Plus提供的In…

MyBatis 批量插入数据的 3 种方法!

作者 | 王磊 来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09; 转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone 批量插入功能是我们日常工作中比较常见的业务功能之一&#xff0c;之前我也写过一篇关于《MyBatis Plus 批量数据插入功能&#xff0c…

mybatis遍历

参考&#xff1a;foreach 实现 MyBatis 遍历集合与批量操作数据_点滴记录-CSDN博客_mybatis遍历list SELECT * FROM t_employee WHERE id IN (1, 2, 3, ...) /** 根据传入的 id 集合&#xff0c;查询出对应的员工信息&#xff0c;并使用集合保存信息 */ List<Employee> …

MyBatis 使用 foreach 批量插入

教程 单条语句插入多个值 Mapper public interface UserMapper {void batchSave(List<User> userList); }<insert id"batchSave">insert into user(name, password) values<foreach collection"list" item"user" separator&quo…

MyBatis foreach 标签查询案例 MyBatis 批量插入 MyBatis foreach标签批量插入

MyBatis foreach 标签查询案例 MyBatis 批量插入 MyBatis foreach标签批量插入 一、查询语句 <if test"userNos ! null and userNos ! ">AND a.USER_NO IN<foreach collection"userNos.split(,)" item"e" open"(" close"…

Mybatis 批量插入

insert, update 和 delete 前文我们说到了select标签&#xff0c;以及一些复杂查询的处理。本文我们主要讨论一下Mybatis的批量插入操作。在这之前&#xff0c;我们还是得先了解insert, update 和 delete标签。 <insertid"insertAuthor"parameterType"doma…

美德乐吸奶器怎么样?

美德乐吸奶器中国官网地址为&#xff1a;http://medela.wang&#xff0c;旨在为中国妈妈提供关于美德乐吸奶器产品介绍&#xff0c;美德乐吸奶器售后服务。经过几十年躬耕和发展。美德乐已经赢得了中国妈妈的信赖&#xff0c;下面让我们来看一下妈妈们对美德乐产品的评价。 作为…

mybatis——动态SQL(使用foreach实现批量插入数据)

mybatis——动态SQL&#xff08;使用foreach实现批量插入数据&#xff09; 1、在UserMapper接口类写批量插入数据的接口 void insertList(List<User> list);2、在对应的UserMapper.xml文件里写SQL语句 <mapper namespace"com.xyxy.mapper.UserMapper">…