首页 > 其他分享 >Mybatis|MybatisPlus批量插入

Mybatis|MybatisPlus批量插入

时间:2023-01-16 11:45:54浏览次数:28  
标签:MybatisPlus 批量 System userList user Mybatis import com public

创建一个SpringBoot工程

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/>
    </parent>

    <groupId>com.qbb</groupId>
    <artifactId>mybatis_batch_insert</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <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>3.0.1</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>
    </dependencies>
</project>

方式一:for循环的方式 编写bean、service、dao、测试类

service

void batchInsertByFor(User user);

service-impl

@Autowired
private UserMapper userMapper;

@Override
public void batchInsertByFor(User user) {
	userMapper.batchInsertByFor(user);
}

dao

<insert id="batchInsertByFor">
        insert into user
        values (#{id}, #{username}, #{password})
</insert>

测试类

import com.qbb.Application;
import com.qbb.domain.User;
import com.qbb.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = Application.class)
public class BatchInsertByForTest {


    @Autowired
    private UserService userService;

    @Test
    public void forTest(){
        long start = System.currentTimeMillis();
        for(int i = 0 ;i < 10000; i++) {
            User user = new User();
            user.setUsername("name" + i);
            user.setPassword("password" + i);
            userService.batchInsertByFor(user);
        }
        long end = System.currentTimeMillis();
        System.out.println("一万条数据总耗时:" + (end-start) + "ms" );

    }
}

结果:一万条数据总耗时 : 327582ms(我电脑比较垃圾.....,反正就是很耗时)
image

方式二:MyBatis以集合方式批量新增 编写bean、service、dao、测试类

service

void batchInsert(List<User> users);

service-impl

@Override
public void batchInsert(List<User> users) {
	userMapper.batchInsert(users);
}

dao

<insert id="batchInsert">
	INSERT INTO user (username, password)
	VALUES
	<foreach collection ="users" item="user" separator =",">
		(#{user.username}, #{user.password})
	</foreach>
</insert>

测试类

@Test
public void batchInsertTest() {
	long start = System.currentTimeMillis();
	List<User> userList = new ArrayList<>();
	for (int i = 0; i < 10000; i++) {
		User user = new User();
		user.setUsername("name" + i);
		user.setPassword("password" + i);
		userList.add(user);
	}
	userService.batchInsert(userList);
	long end = System.currentTimeMillis();
	System.out.println("一万条数据总耗时:" + (end - start) + "ms");
}

结果:一万条数据总耗时:2005ms(快了很多,推荐使用)
image

方式三:MyBatisPlus以集合方式批量新增 编写测试类

测试类

@Test
public void MPBatchInsertTest() {
	long start = System.currentTimeMillis();
	List<User> userList = new ArrayList<>();
	for (int i = 0; i < 10000; i++) {
		User user = new User();
		user.setUsername("name" + i);
		user.setPassword("password" + i);
		userList.add(user);
	}
	userService.saveBatch(userList);
	long end = System.currentTimeMillis();
	System.out.println("一万条数据总耗时:" + (end - start) + "ms");
}

结果:一万条数据总耗时:3693ms(快了很多,推荐使用)
image

方式四:MyBatis-Plus提供的InsertBatchSomeColumn方法 编写handle、config、测试类

handle

package com.qbb;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;

import java.util.List;

/**
 * 批量插入处理器
 */
public class MPBatchHandle extends DefaultSqlInjector {

    @Override
    public 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;
    }
}

config

package com.qbb.config;

import com.qbb.MPBatchHandle;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisConfig {

    @Bean
    public MPBatchHandle mpBatchHandle(){
        return new MPBatchHandle();
    }
}

service

void insertBatchSomeColumn(List<User> userList);

service-impl

 @Override
    public void insertBatchSomeColumn(List<User> userList) {
        userMapper.insertBatchSomeColumn(userList);
    }

dao

public interface EasyBaseMapper<T> extends BaseMapper<T> {
    /**
     * 批量插入 仅适用于mysql
     *
     * @param entityList 实体列表
     * @return 影响行数
     */
    Integer insertBatchSomeColumn(Collection<T> entityList);
}
@Mapper
public interface UserMapper extends BaseMapper<User>,EasyBaseMapper<User> {
    void batchInsert(@Param("users") List<User> users);
}

测试类

@Test
public void MPInsertBatchSomeColumnTest(){
	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);
	}
	userService.insertBatchSomeColumn(userList);
	long end = System.currentTimeMillis();
	System.out.println("一万条数据总耗时:" + (end-start) + "ms" );
}

结果:一万条数据总耗时:2224ms(快了很多,推荐使用)
image

标签:MybatisPlus,批量,System,userList,user,Mybatis,import,com,public
From: https://www.cnblogs.com/qbbit/p/17055045.html

相关文章

  • Ansible 学习笔记 - 批量巡检站点 URL 状态
    前言不拖泥带水,不东拉西扯。速战速决,五分钟学到一个工作用得上的技巧。通过一个个具体的实战案例,来生动演示Ansible的用法。需求我需要定期巡检或定时监控我公司的......
  • 基于正则批量模糊匹配并提取字符串中的内容
    平常开发和测试运维过程中,有些中间数据需要用正则方式匹配,每次都是写个小段代码实现,非常不方便。为了解决后顾只有,这里用js实现了一个通用的正则表达式提取特定内容的工具......
  • (已解决)Mybatis逆向生成时,没有生成根据主键的select、update和delete方法
    使用mybatis逆向生成时,发现mapper接口中没有生成...ByPrimaryKey的方法,在generatorConfig.xml配置文件的数据库连接,即jdbcConnection标签中加入<propertyname="useInf......
  • MyBatisPlus:DML编程控制
    MyBatisPlus前面我们讲解了​​基于MyBatisPlus完成标准Dao的增删改查功能​​掌握MyBatisPlus中的分页及条件查询构建|黑马程序员MyBatisPlus:DQL编程控制(条件查询方式、......
  • netmiko批量操作网络设备_pandas版
    fromconcurrent.futuresimportThreadPoolExecutorimportnetmikoimportosfromthreadingimportLockimportpandasaspdclassnet_dev():def__init__(......
  • mybatis-plus 直接查询的数据对对象带嵌套的对象
    1.javaentity定义@Data@EqualsAndHashCode(callSuper=true)@Accessors(chain=true)@TableName(value="delta24_alarmrule",autoResultMap=true)publicclass......
  • 从 PageHelper 到 MyBatis Plugin
    在很多业务场景下我们需要去拦截 ​​SQL​​,达到不入侵原有代码业务处理一些东西,比如:历史记录、分页操作、数据权限过滤操作、​​SQL​​ 执行时间性能监控等等,这里我们......
  • Java使用MyBatis-Plus生成动态数据库表XML配置
    <updateid="createSpiderTable"parameterType="com.quanchengle.app.spider.CreateSpiderTableAndTableName">CREATETABLEIFNOTEXISTS${tableName}(<if......
  • Earthdata批量下载MODIS遥感影像的方法
      本文介绍在Earthdata网站中,批量下载MODIS遥感影像的方法。  首先,打开网页:https://search.earthdata.nasa.gov/search,如果没有Earthdata账号的话可以注册一下。 ......
  • mybatis&mybatis-plus的sql语句
    在springboot项目中,我们会使用到sql语句,要么是使用mybatis-plus底层已经写好的,要么是使用mybatis,来编写对应的sql映射文件.注意:在springboot中,只需要导入mybatis-pl......