• MyBatis利用For循环批量插入
  • MyBatis的手动批量提交
  • MyBatis以集合方式批量新增(推荐)
  • MyBatis-Plus提供的SaveBatch方法
  • MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)

    文章目录

    • 1.项目准备
      • 1.1 pom文件
      • 1.2 yml文件
      • 1.3 User类
    • 2.MyBatis利用For循环批量插入
    • 3.MyBatis的手动批量提交
    • 4.MyBatis以集合方式批量新增(推荐)
    • 5.MyBatis-Plus提供的SaveBatch方法
    • 6.MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)

1.项目准备

1.1 pom文件

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><!--Mybatis依赖-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency><!--Mybatis-Plus依赖-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

1.2 yml文件


server:port: 8080spring:datasource:username: mysql用户名password: mysql密码url: jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapping/*.xml

1.3 User类

@Data
public class User {private int id;private String username;private String password;
}

2.MyBatis利用For循环批量插入

@Service
public class UserService {@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();for(int i = 0 ;i < 10000; i++) {User user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userMapper.insertUsers(user);}long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}}
@Mapper
public interface UserMapper {Integer insertUsers(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ithuang.demo.mapper.UserMapper"><insert id="insertUsers">INSERT INTO user (username, password)VALUES(#{username}, #{password})</insert>
</mapper>
一万条数据总耗时:26348ms

3.MyBatis的手动批量提交


@Service
public class UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate SqlSessionTemplate sqlSessionTemplate;public void InsertUsers(){//关闭自动提交SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);UserMapper userMapper = sqlSession.getMapper(UserMapper.class);long start = System.currentTimeMillis();for(int i = 0 ;i < 10000; i++) {User user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userMapper.insertUsers(user);}sqlSession.commit();long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}}
一万条数据总耗时:24516ms

4.MyBatis以集合方式批量新增(推荐)

@Service
public class UserService {@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}userMapper.insertUsers(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}}
@Mapper
public interface UserMapper {Integer insertUsers(List<User> userList);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ithuang.demo.mapper.UserMapper"><insert id="insertUsers">INSERT INTO user (username, password)VALUES<foreach collection ="userList" item="user" separator =",">(#{user.username}, #{user.password})</foreach></insert>
</mapper>
一万条数据总耗时:521ms

5.MyBatis-Plus提供的SaveBatch方法

@Service
public class UserService extends ServiceImpl<UserMapper, User> implements IService<User> {public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}saveBatch(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}
@Mapper
public interface UserMapper extends BaseMapper<User> {}
一万条数据总耗时:24674ms

6.MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)

public class EasySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {// 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}
@Configuration
public class MybatisPlusConfig {@Beanpublic EasySqlInjector sqlInjector() {return new EasySqlInjector();}
}
public class UserService{@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}userMapper.insertBatchSomeColumn(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}

public interface EasyBaseMapper<T> extends BaseMapper<T> {/*** 批量插入 仅适用于mysql** @param entityList 实体列表* @return 影响行数*/Integer insertBatchSomeColumn(Collection<T> entityList);
}
@Mapper
public interface UserMapper<T> extends EasyBaseMapper<User> {}
一万条数据总耗时:575ms

MyBatis批量插入的五种方式相关推荐

  1. mybatis 批量插入的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.fore ...

  2. jdbc批量插入的4种方式【百万条数据插入只需几秒】

    mysql数据库准备 #打开数据库test01; use test01; #创建表a,表a包含int型的id列.可变长度型的name[长度20个字符] create table a (id INT,N ...

  3. 【MyBatis】关于MyBatis批量更新的几种方式

    1. Java代码循环执行sql,逐条更新 这种方式就是将需要更新的数据,循环调用update方法去更新数据,实现代码如下: public void test() {// 需要更新的集合List< ...

  4. 实战演练 | 批量插入的三种方式

    最近,我写了一个 node.js 脚本,每天要循环访问数百万个文件,并将其内容插入 MySQL 数据库.该脚本不是一次处理一条记录,而是将文件内容存储在内存中,然后每 1000 个文件运行一次 INS ...

  5. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  6. 后端技术:MyBatis 批量插入的 3 种写法

    运行环境: 数据库使用的是sqlserver,JDK版本1.8,运行在SpringBoot环境下,对比3种可用的方式: 反复执行单条插入语句 xml拼接sql 批处理执行 先说结论:少量插入请使用反复 ...

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

    批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...

  8. MyBatis批量插入(sqlserver BULK INSERT)

    MyBatis批量插入: 1. foreach方式 2.sqlsession + sqlsession.flushStatements方式: //        SqlSession sqlSessi ...

  9. SSM整合之Mybatis笔记( MyBatis获取参数值的两种方式(重要))(P020—P025)

    P20 MyBatis获取参数值的两种方式(重要) 一.什么叫做获取取参数值的两种方式 以后在我们开发是方向B/S系统,然后我们现在要做的任务通过浏览器/页面/视图 收集用户输入的一些数据,然后把这些 ...

最新文章

  1. 求助!!让我郁闷纠结恨的状况!!!
  2. bilibili Saber 实时计算平台架构与实践【Apache Flink 替换 Spark Stream的架构与实践】
  3. 【算法设计与分析】10 差消法化简高阶递推方程
  4. c++ 协程_用yield实现协程
  5. (19)Xilinx PCIE中断理论(学无止境)
  6. 算法导论 练习12.1
  7. 【无线通信】基于matlab无线传感网络WSN仿真【含Matlab源码 1237期】
  8. 迅捷pdf虚拟打印机怎么安装使用
  9. python100例详解-python案例讲解
  10. 华为手机 图标消失_华为手机桌面图标不见了怎么办
  11. webpack 基础学习
  12. labview压装设备最终代码,基于QMH框架和Machine框架有机结合
  13. 阅兵方阵 蓝桥杯 第九届JavaA
  14. Number theory 1_2, To prove there is no rational solution of equation: x^2+y^2=7
  15. UVA12307 Smallest Enclosing Rectangle 题解
  16. SqlServer数据库性能优化详解
  17. 一款简易低成本智能割草机的制作——硬件篇
  18. addon游戏_我的世界多人addon地图
  19. 【bat】 创建一个文件的快捷方式
  20. c语言中1 lt lt 10什么意思,卡西欧lt1和lt3是什么意思

热门文章

  1. java用swing日历标记节日,java基于swing实现日历
  2. C·cJSON库函数--cJSON_GetObjectItem
  3. putty 报错no supported authentication methods available (server sent:publickey...)
  4. MeEdu开源网校系统-手动安装教程(完整版)
  5. linux开放端口的两种方法
  6. vector<int> v 与 vector<int> v(n) 的区别
  7. 二维图形平移变换c语言程序,[转载]计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换...
  8. opencv频域滤波 C++实现陷波滤波器
  9. 绿色荧光标记麦胚凝集素(FITC-WGA)
  10. Linux--增加用户、添加用户组