1.新建一个类 MySqlInjector
package com.cx.sasmerp.config;
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;
/**
* <p>
* 自定义Sql注入
* </p>
*
* @author Lch
* @dateTime 2024/3/1 15:30
*/
public class MySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
//增加自定义方法,字段注解上不等于FieldFill.DEFAULT的字段才会插入
methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.DEFAULT));
return methodList;
}
}
2.注册自定义的 MySqlInjector
![](https://img-blog.csdnimg.cn/direct/2d56fb4611d9425ea0e6b60df63bb756.png)
@Bean
public MySqlInjector sqlInjector() {
return new MySqlInjector();
}
3.新建接口MyBaseMapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author Lch
* @dateTime 2024/3/1 15:32
*/
public interface MyBaseMapper <T> extends BaseMapper<T> {
int insertBatchSomeColumn(List<T> entityList);
}
4.修改mapper中继承的baseMapper
5.修改实体,过滤不需要插入的字段
需要过滤的字段上加 @TableField(fill = FieldFill.DEFAULT)
6.ok了
7.测试
8.解释
自定义 Mapper 接口 (
MyBaseMapper
):
- 继承自
BaseMapper
。- 声明了一个批量插入方法
insertBatchSomeColumn
,这个方法没有具体实现,因为实际的 SQL 逻辑将在自定义的 SQL 注入器中实现。自定义 SQL 注入器 (
MySqlInjector
):
- 继承自
DefaultSqlInjector
。- 重写
getMethodList
方法,获取默认的 SQL 方法列表,并添加自定义的InsertBatchSomeColumn
方法。InsertBatchSomeColumn
是 MyBatis-Plus 提供的一个方法,用于批量插入。你可以通过传递一个 Lambda 表达式来控制哪些字段参与插入,这里配置为仅插入FieldFill
不等于DEFAULT
的字段。配置文件 (
MyBatisPlusConfig
):
- 在 Spring 配置中,注册自定义的
MySqlInjector
,使其能够被 MyBatis-Plus 识别和使用。服务类 (
YourService
):
- 使用
MyBaseMapper
执行批量插入操作。- 调用
insertBatchSomeColumn
方法,将实体列表批量插入数据库。通过这些步骤,实现了一个灵活的批量插入功能,使用了 MyBatis-Plus 提供的扩展机制,能够在批量插入时动态地控制哪些字段参与插入。