文章目录
前言
在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);
}
}