MybatisPlus真正的批量新增

文章目录


前言

在Mybatis-Plus的 IService接口中,默认提供 saveBatch批量插入,也是唯一一个默认批量插入。

java 复制代码
public interface IService<T> {
    ...

    @Transactional(
        rollbackFor = {Exception.class}
    )
    default boolean saveBatch(Collection<T> entityList) {
        return this.saveBatch(entityList, 1000);
    }
    ...
}

在数据量不是很大的情况下可以直接使用,但是saveBatch底层实现是一条一条执行的,插入多少条数据就相当于执行了多少次的插入sql。

saveBatch内部实现代码

com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch

java 复制代码
    @Transactional(
        rollbackFor = {Exception.class}
    )
    public boolean saveBatch(Collection<T> entityList, int batchSize) {
        String sqlStatement = this.getSqlStatement(SqlMethod.INSERT_ONE);
        return this.executeBatch(entityList, batchSize, (sqlSession, entity) -> {
            sqlSession.insert(sqlStatement, entity);
        });
    }

为了实现真正高效的批量插入,以下使用 insertBatchSomeColumn 方法,实现一次性批量插入。

pom.xml

xml 复制代码
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>

application.yml

yml 复制代码
server:
  port: 8080
  servlet:
    context-path: /
spring:
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true
     username: root
     password: 123456
     driver-class-name: com.mysql.cj.jdbc.Driver

logging:
  level:
    root: info
mybatis-plus:
  # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
  mapper-locations: classpath:/mapper/*Mapper.xml,/mapper/**/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.qf.**
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

配置类

java 复制代码
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 InsertBatchInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass,tableInfo);
        //更新时自动填充的字段,不用插入值
        methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
        return methodList;
    }
}
java 复制代码
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
    @Bean
    public InsertBatchInjector sqlInjector() {
        return new InsertBatchInjector();
    }
}

实体类

java 复制代码
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @author qixiansheng
 * @version 1.0
 * @data 2025/12/18 21:31
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Orders implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private Date createTime;

    private BigDecimal price;

    private Integer status;
}

Mapper

java 复制代码
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.List;

public interface BatchMapper<T> extends BaseMapper<T> {
    /**
     * 真正的批量插入
     * @param entityList
     */
    Integer insertBatchSomeColumn(List<T> entityList);
}
java 复制代码
import com.qf.entity.Orders;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author qixiansheng
 * @version 1.0
 * @data 2025/12/18 21:33
 */
@Mapper
public interface OrderMapper extends BatchMapper<Orders> {

}

Controller

java 复制代码
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.entity.DeviceRecord;
import com.qf.entity.Orders;
import com.qf.mapper.OrderMapper;
import com.qf.service.IDeviceRecordService;
import com.qf.service.IOrdersService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author qf
 * @since 2025-06-12
 */
@RestController
@RequestMapping("/test")
public class TestController {
    @Autowired
    private OrderMapper orderMapper;

    @GetMapping("save")
    public Integer save() {
        Date date = DateUtil.parse("2025-08-01 21:00:00");

        List<Orders> orders = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Date offset = DateUtil.offsetMonth(date, i);
            Orders order = new Orders();
            order.setId(IdUtil.getSnowflake(1, 1).nextId());
            order.setCreateTime(offset);
            order.setPrice(new BigDecimal(i));
            order.setStatus(1);
            orders.add(order);
        }
        return orderMapper.insertBatchSomeColumn(orders);
    }
}

相关推荐
乌暮17 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小荷才露尖尖角,早有蜻蜓立上头20 小时前
SpringBoot+QQ邮箱发送邮件
spring boot
头发还在的女程序员1 天前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_20101 天前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
yuyuxun12 天前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
LGL6030A2 天前
Java学习历程31——初识Spring Boot
java·spring boot·学习
阿达和自己2 天前
springboot学习-springboot引入MyBatis-Plus
spring boot·学习·mybatis
2603_969694852 天前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
Jackzhang2 天前
[运维排障实录] 第一次遇到 502 别急着重启:按「一条线」把问题查清楚
spring boot
wang_shu_mo_ran3 天前
MyBatis 从入门到进阶(一)
java·spring·mybatis