首页 > 其他分享 >MyBatis批量插入的五种方式,哪种最强???

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

时间:2023-02-11 21:59:16浏览次数:51  
标签:批量 UserMapper System 五种 user 一万条 MyBatis User

前言:

这里我列举了MyBatis和MyBatis-Plus常用的五种批量插入的方式,进行了详细的总结归纳,写的非常详细,整体思路清晰明了,只分享干货。

目录

一、准备工作

二、MyBatis利用For循环批量插入

三、MyBatis的手动批量提交

四、MyBatis以集合方式批量新增(推荐)

五、MyBatis-Plus提供的SaveBatch方法

六、MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)

七、总结


一、准备工作

1、导入pom.xml依赖

  1. <dependency>
  2. <groupId>mysql</groupId>
  3. <artifactId>mysql-connector-java</artifactId>
  4. <scope>runtime</scope>
  5. </dependency>
  6. <!--Mybatis依赖-->
  7. <dependency>
  8. <groupId>org.mybatis.spring.boot</groupId>
  9. <artifactId>mybatis-spring-boot-starter</artifactId>
  10. <version>2.2.2</version>
  11. </dependency>
  12. <!--Mybatis-Plus依赖-->
  13. <dependency>
  14. <groupId>com.baomidou</groupId>
  15. <artifactId>mybatis-plus-boot-starter</artifactId>
  16. <version>3.5.2</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.projectlombok</groupId>
  20. <artifactId>lombok</artifactId>
  21. <optional>true</optional>
  22. </dependency>

2、配置yml文件

  1. server:
  2. port: 8080
  3. spring:
  4. datasource:
  5. username: mysql用户名
  6. password: mysql密码
  7. url: jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
  8. driver-class-name: com.mysql.cj.jdbc.Driver
  9. mybatis:
  10. mapper-locations: classpath:mapping/*.xml

 3、公用的User类

  1. @Data
  2. public class User {
  3. private int id;
  4. private String username;
  5. private String password;
  6. }

二、MyBatis利用For循环批量插入

1、编写UserService服务类,测试一万条数据耗时情况

  1. @Service
  2. public class UserService {
  3. @Resource
  4. private UserMapper userMapper;
  5. public void InsertUsers(){
  6. long start = System.currentTimeMillis();
  7. for(int i = 0 ;i < 10000; i++) {
  8. User user = new User();
  9. user.setUsername("name" + i);
  10. user.setPassword("password" + i);
  11. userMapper.insertUsers(user);
  12. }
  13. long end = System.currentTimeMillis();
  14. System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
  15. }
  16. }

2、编写UserMapper接口

  1. @Mapper
  2. public interface UserMapper {
  3. Integer insertUsers(User user);
  4. }

3、编写UserMapper.xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ithuang.demo.mapper.UserMapper">
  6. <insert id="insertUsers">
  7. INSERT INTO user (username, password)
  8. VALUES(#{username}, #{password})
  9. </insert>
  10. </mapper>

4、进行单元测试

  1. @SpringBootTest
  2. class DemoApplicationTests {
  3. @Resource
  4. private UserService userService;
  5. @Test
  6. public void insert(){
  7. userService.InsertUsers();
  8. }
  9. }

5、结果输出

一万条数据总耗时:26348ms

三、MyBatis的手动批量提交

1、其他保持不变,Service层作稍微的变化

  1. @Service
  2. public class UserService {
  3. @Resource
  4. private UserMapper userMapper;
  5. @Resource
  6. private SqlSessionTemplate sqlSessionTemplate;
  7. public void InsertUsers(){
  8. //关闭自动提交
  9. SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
  10. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  11. long start = System.currentTimeMillis();
  12. for(int i = 0 ;i < 10000; i++) {
  13. User user = new User();
  14. user.setUsername("name" + i);
  15. user.setPassword("password" + i);
  16. userMapper.insertUsers(user);
  17. }
  18. sqlSession.commit();
  19. long end = System.currentTimeMillis();
  20. System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
  21. }
  22. }

2、结果输出

一万条数据总耗时:24516ms

四、MyBatis以集合方式批量新增(推荐)

1、编写UserService服务类

  1. @Service
  2. public class UserService {
  3. @Resource
  4. private UserMapper userMapper;
  5. public void InsertUsers(){
  6. long start = System.currentTimeMillis();
  7. List<User> userList = new ArrayList<>();
  8. User user;
  9. for(int i = 0 ;i < 10000; i++) {
  10. user = new User();
  11. user.setUsername("name" + i);
  12. user.setPassword("password" + i);
  13. userList.add(user);
  14. }
  15. userMapper.insertUsers(userList);
  16. long end = System.currentTimeMillis();
  17. System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
  18. }
  19. }

3、编写UserMapper接口

  1. @Mapper
  2. public interface UserMapper {
  3. Integer insertUsers(List<User> userList);
  4. }

4、编写UserMapper.xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ithuang.demo.mapper.UserMapper">
  6. <insert id="insertUsers">
  7. INSERT INTO user (username, password)
  8. VALUES
  9. <foreach collection ="userList" item="user" separator =",">
  10. (#{user.username}, #{user.password})
  11. </foreach>
  12. </insert>
  13. </mapper>

5、输出结果

一万条数据总耗时:521ms

五、MyBatis-Plus提供的SaveBatch方法

1、编写UserService服务

  1. @Service
  2. public class UserService extends ServiceImpl<UserMapper, User> implements IService<User> {
  3. public void InsertUsers(){
  4. long start = System.currentTimeMillis();
  5. List<User> userList = new ArrayList<>();
  6. User user;
  7. for(int i = 0 ;i < 10000; i++) {
  8. user = new User();
  9. user.setUsername("name" + i);
  10. user.setPassword("password" + i);
  11. userList.add(user);
  12. }
  13. saveBatch(userList);
  14. long end = System.currentTimeMillis();
  15. System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
  16. }
  17. }

2、编写UserMapper接口

  1. @Mapper
  2. public interface UserMapper extends BaseMapper<User> {
  3. }

3、单元测试结果

一万条数据总耗时:24674ms

六、MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)

1、编写EasySqlInjector 自定义类

  1. public class EasySqlInjector extends DefaultSqlInjector {
  2. @Override
  3. public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
  4. // 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法
  5. List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
  6. methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
  7. return methodList;
  8. }
  9. }

2、定义核心配置类注入此Bean

  1. @Configuration
  2. public class MybatisPlusConfig {
  3. @Bean
  4. public EasySqlInjector sqlInjector() {
  5. return new EasySqlInjector();
  6. }
  7. }

3、编写UserService服务类

  1. public class UserService{
  2. @Resource
  3. private UserMapper userMapper;
  4. public void InsertUsers(){
  5. long start = System.currentTimeMillis();
  6. List<User> userList = new ArrayList<>();
  7. User user;
  8. for(int i = 0 ;i < 10000; i++) {
  9. user = new User();
  10. user.setUsername("name" + i);
  11. user.setPassword("password" + i);
  12. userList.add(user);
  13. }
  14. userMapper.insertBatchSomeColumn(userList);
  15. long end = System.currentTimeMillis();
  16. System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
  17. }
  18. }

4、编写EasyBaseMapper接口

  1. public interface EasyBaseMapper<T> extends BaseMapper<T> {
  2. /**
  3. * 批量插入 仅适用于mysql
  4. *
  5. * @param entityList 实体列表
  6. * @return 影响行数
  7. */
  8. Integer insertBatchSomeColumn(Collection<T> entityList);
  9. }

5、编写UserMapper接口

  1. @Mapper
  2. public interface UserMapper<T> extends EasyBaseMapper<User> {
  3. }

6、单元测试结果

一万条数据总耗时:575ms

七、总结

以上就是我对目前MyBatis常用的批量插入方法的总结

来源:https://blog.csdn.net/HJW_233/article/details/126909439

标签:批量,UserMapper,System,五种,user,一万条,MyBatis,User
From: https://www.cnblogs.com/konglxblog/p/17112631.html

相关文章

  • Mybatis plus按照时间排序后分页查询有重复情况
    场景有一个根据create_time排序的分页接口,在第二页会出现第一页出现过的重复记录排查思路排查1、入参处理时对分页相关数据的处理有问题排查2、sql的入参数有问题经......
  • 014_SpringBoot整合MyBatisPlus
    MyBatis-Plus与MyBatis区别:导入坐标不同;数据层实现简化。①:在pom.xml手动添加SpringBoot整合MyBatis-Plus的坐标,可以通过mvnrepository获取  ②:在dao层里......
  • java加快批量插入的两个方法
    一:配置参数:关于rewriteBatchedStatements这个参数介绍:MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。......
  • Go使用协程批量获取数据,加快接口返回速度
    服务端经常需要返回一个列表,里面包含很多用户数据,常规做法当然是遍历然后读缓存。使用Go语言后,可以并发获取,极大提升效率。使用channelpackagemainimport("fmt"......
  • MybatisPlus 多表关联分页关联查询
     我这里提供的是mybatisplus和xml配置文件结合的方式:直接从service层开始写:service//这是service层,多表分页的简单逻辑处理,重点是IPage和Map,//IPage就是分......
  • 【spring-boot-route(七)整合jdbcTemplate操作数据库+(八)整合mybatis操作数据库】
    在一部分内容中,我们学习了Restful接口的编写,及接口文档的生成。我们需要将接口数据进行持久化存储,这一部分我们主要学习几种持久化框架将数据进行存储。本部分内容中,我们都......
  • delphi FireDAC使用ApplyUpdates批量提交数据
    简单的设计一下界面,大致如下:要求:审核或者反审核用户选择的数据1.当记录已审核时,再点审核会提示出错,反审核也一样2.正常点审核时,审核=true,审核人=当前用......
  • 013_整合MyBatis(基础操作)
    SPringBoot整合MyBatis:①:创建新模块,选择Spring初始化,并配置模块相关基础信息 ②:选择当前模块需要使用的技术集(MyBatis、MySQL)   ③:设置数据源参数(数据库连......
  • mybatis 没写sql语句,怎么知道去查哪张表呢
      我们在继承BaseMapper时,指定了泛型是<User>,默认就把类的名称User作为表名称、把类中的属性作为数据库字段。不区分大小写......
  • Postman 的批量登录案例
    Postman的批量登录案例在并发项目中,需要测试多用户场景下的超买超卖项目中的用户登录状态检测使用redis中的token因此为了模拟多用户下单的情况,需要足够多的活跃用户,......