本文转载自微信公众号“Java中文社区”,作者雷哥。转载本文请联系Java中文社区公众号。批量插入功能是我们日常工作中比较常见的业务功能之一。之前也写过一篇关于?的文章,但是评论区的反馈不是很好。主要有两个问题:第一,MyBatis很多人对Plus(以下简称MP)的批量插入功能有误解,认为MP也是使用循环一次插入数据,所以性能并没有提升;有人知道。所以基于以上情况,雷哥决定对MyBatis批量插入做一个总结,同时对三种实现方式做一个性能测试,以及相应的原理分析。首先简单说一下三种批量插入功能:循环单次插入;MP批量插入功能;本机批量插入功能。在准备工作开始之前,让我们创建数据库和测试数据。执行的SQL脚本如下:-------------------------------CREATEDATABASE------------------------------SETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0;DROPDATABASEIFEXISTS`testdb`;CREATEDATABASE`testdb`;USE`testdb`;------------------------------创建用户表-----------------------------DROPTABLEIFEXISTS`user`;CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_binNULLDEFAULTNULL,`password`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_binNULLDEFAULTNULL,`createtime`datetimeNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`)USINGBTREE)ENGINE=InnoDBAUTO_INCREMENT=6CHARACTERSET=utf8mb4COLLATE=utf8mb4_binROWyn_FORMAT;--------am------------添加测试数据------------------------------INSERTINTO`user`VALUES(1,'赵云','123456','2021-09-1018:11:16');INSERTINTO`user`VALUES(2,'张Fei','123456','2021-09-1018:11:28');INSERTINTO`user`VALUES(3,'关羽','123456','2021-09-1018:11:34');INSERTINTO`user`VALUES(4,'刘备','123456','2021-09-1018:11:41');INSERTINTO`user`VALUES(5,'曹操','123456','2021-09-1018:12:02');SETFOREIGN_KEY_CHECKS=1;数据库最终效果如下:1.循环单次插入接下来我们使用SpringBoot项目批量插入10W条数据分别测试每个方法的执行时间循环单个插入的(测试)核心代码如下:。豆子。factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;@SpringBootTestclassUserControllerTest{//最大循环次数privatestaticfinalintMAXCOUNT=100000;@AutowiredprivateUserServiceImpluserService;/***循环单次插入*/@Testvoidsave(){longstime=System.currentTimeMillis();//统计开始时间for(inti=0;icom.baomidoumybatis-plus-boot-startermybatis-plus-latest-version注:mybatis-plus-latest-version表示MP框架的最新版本号,可以访问https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter查询最新的版本号,但是使用的时候记得把上面的“mybatis-plus-latest-version”换成具体的版本号。和3.4.3一样,可以正常引入框架MP框架更多介绍请访问其官网:https://baomidou.com/guide/①controller实现importcom.example.demo.model.User;importcom.example.demo.service.impl.UserServiceImpl;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.ArrayList;importjava.util.List;@RestController@RequestMapping("/u")publicclassUserController{@AutowiredprivateUserServiceImpluserService;/***批量插入(自定义)*/@RequestMapping("/mysavebatch")publicbooleanmySaveBatch(){Listlist=newArrayList<>();//(用户)数据添加(inti=0;i<1000;i++){Useruser=newUser();user.setName("test:"+i);user.setPassword("123456");list.add(user);}returnuserService.saveBatchCustom(list);}}②业务逻辑层实现importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.example.demo.mapper.UserMapper;导入com.example.demo.model。用户;importcom.example.demo.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassUserServiceImplextendsServiceImplimplementsUserService{@AutowiredprivateUserMapperuserMapper;publicbooleansaveBatchCustom(Listlist){returnuserMapper.saveBatchCustom(list);}}③数据持久层实现importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.demo.model.User;importorg.apache.ibatis.annotations.Mapper;importjava.util.List;@MapperpublicinterfaceUserMapperextendsBaseMapper{booleansaveBatchCustom(Listlist);}上面代码实现后,我们就可以使用MP来实现批量插入数据的功能了,但是本文除了具体实现代码另外,我们还需要知道每个方法的执行效率,所以我们来写MP的测试代码MP性能测试.boot.test.context.SpringBootTest;importjava.util.ArrayList;importjava.util.List;@SpringBootTestclassUserControllerTest{//最大循环次数privatestaticfinalintMAXCOUNT=100000;@AutowiredprivateUserServiceImpluserService;/***MP批量插入*/@TestvoidsaveBatch(){longstime=System.currentTimeMillis();//统计开始时间Listlist=newArrayList<>();for(inti=0;iimplementsUserService{@AutowiredprivateUserMapperuserMapper;publicbooleansaveByNativelist){returnuserMapper.saveBatchByNative(list);}}②数据持久层扩展在UserMapper中添加saveBatchByNative方法,实现代码如下:importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example。演示模型。User;importorg.apache.ibatis.annotations.Mapper;importjava.util.List;@MapperpublicinterfaceUserMapperextendsBaseMapper{booleansaveBatchByNative(Listlist);}③添加UserMapper.xml创建UserMapper.xml文件,使用foreach标签拼接SQL,具体实现代码如下:INSERTINTO`USER`(`NAME`,`PASSWORD`)VALUES(#{item.name},#{item.password})之后以上步骤,我们原生的批量插入功能实现的差不多了,接下来我们通过单元测试来检验这个方法的执行效率原生批量插入性能测试.springframework.boot.test.context.SpringBootTest;importjava.util.ArrayList;importjava.util.List;@SpringBootTestclassUserControllerTest{//最大循环次数privatestaticfinalintMAXCOUNT=100000;@AutowiredprivateUserServiceImpluserService;/@TestvoidsaveBatchByNative(){longstime=System.currentTimeMillis();//统计开始时间Listlist=newArrayList<>();for(inti=0;i