数据库批量插入数据的三种方法

一、准备工作

测试环境:SpringBoot项目+MybatisPlus框架+MySQL数据库+Lombok

二、导入依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>

三、yml配置文件

server:port: 8081spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceusername: rootpassword: 123456url: jdbc:mysql://localhost:3306/mysql?useSSL=false&characterEncoding=utf-8&useUnicode=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true##rewriteBatchedStatements=true   开启批处理模式

四、实体类(数据库表要有对应字段)

package com.cy.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private Integer id;private String username;private String password;}

五、测试

  1. 方法一:for循环插入(单条)(总耗时:n分钟,每次都要获取连接Connection、释放连接和关闭资源等操作,比较耗时,这里就没测了)
	@RequestMapping("/test3")  //单个插入(慢)public String test3(){long startTime=System.currentTimeMillis();for(int i=0;i<100000;i++){userService.save(new User(i+1,"张三","123456"));}long endTime=System.currentTimeMillis();long result=endTime-startTime;return "总耗时:"+(result/1000);}
  1. 方法二:批量插入saveBatch(4~7秒,这里用到了MybatisPLus的saveBatch批量插入方法,实际也是for循环单条插入,只不过它是利用分片处理batchSize=1000和分批提交事务,从而提高了性能,不用在Connection上消费性能了)(推荐)
	@RequestMapping("/test2")  //批量插入saveBatch(分片处理batchSize=1000,分批提交事务) (次快)public String test2(){List<User> userList=new ArrayList<>();long startTime=System.currentTimeMillis();for(int i=0;i<100000;i++){userList.add(new User(i+1,"张三","123456"));}userService.saveBatch(userList);long endTime=System.currentTimeMillis();long result=endTime-startTime;return "总耗时:"+(result/1000);}
  1. 方法三:循环插入+开启批处理模式(4~7秒,开启批处理模式,关闭自动提交事务,共同用一个sqlsession,单个插入性能得到提升,由于用同一个sqlsession,极大的减少了对资源操作和对事务处理的时间,很好地提高了性能)(推荐)
	@Resourceprivate SqlSessionFactory sqlSessionFactory;@RequestMapping("/test1")  //批量插入(最快)---循环插入+批处理模式 ( 开启批处理模式  rewriteBatchedStatements=true )public String test1(){//开启批处理模式,关闭自动提交事务SqlSession sqlSession= sqlSessionFactory.openSession(ExecutorType.BATCH,false);long startTime=System.currentTimeMillis();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);for(int i=0;i<100000;i++){userMapper.insert(new User(i+1,"张三","123456"));}sqlSession.commit();//一次性提交事务sqlSession.close();//关闭资源long endTime=System.currentTimeMillis();long result=endTime-startTime;return "总耗时:"+(result/1000);}

以上就是全部内容,希望对大家有帮助!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注