一、使用mybatis-plus内置批量插入
mybatis-plus内置提供了InsertBatchSomeCulumn来实现真批量插入,但是由于只支持MySQL的语法格式,所以没有在通用的API作为默认使用。
- 将InsertBatchSomeCulumn实例放入Sqlnjector列表中
@Bean
public DefaultSqlInjector insertBatchSqlInject() {
return new DefaultSqlInjector() {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
};
}
2. 在自己的Mapper类中增加批量插入方法insertBatchSomeColumn
代码语言:java复制public interface UserMapper extends BaseMapper<User> {
Integer insertBatchSomeColumn(List<User> users);
}
其中insertBatchSomeColumn是默认方法名,可以在第1步的配置中指定InsertBatchSomeColumn(String name, Predicate<TableFieldInfo> predicate)方法名。
使用内置方法有一个缺点,不能根据插入实体类是否非空来决定插入的字段列表,为空的会直接插入null值,这就导致了我们在数据库设置的默认是值失效。
二、使用第三方实现
1.引入依赖
代码语言:html复制 <dependency>
<groupId>io.github.timoyung</groupId>
<artifactId>mybatis-plus-batch-core</artifactId>
<version>1.1.2</version>
</dependency>
2.实现BatchServiceImpl类
代码语言:java复制 public interface UserService extends IBatchService<User> {
}
@Service
public class UserServiceImpl extends BatchServiceImpl<UserMapper, User> implements UserService {
}
3.使用批量插入方法(默认模板)
代码语言:java复制 User user1 = new User();
user1.setName("张三");
user1.setAge(18);
User user2 = new User();
user2.setName("李四");
user2.setAge(88);
//使用默认的批量插入条数:1000条/次
this.userService.insertBatch(Arrays.asList(user1, user2));
//指定批量插入条数
this.userService.insertBatch(Arrays.asList(user1, user2), 500);
默认情况下将使用插入列表的第一个实体类的非空字段决定插入字段列表,使用默认方式可能会导致一些字段信息会丢失,因为第一个实体类的非空字段的数量不一定一致,本方式适用于每个实体类非空都一致的情况。
4.使用批量插入方法(指定模板)
代码语言:java复制 User template = new User();
template.setName("AA");
template.setAge(20);
template.setNickName("小A")
User user1 = new User();
user1.setName("张三");
user1.setAge(18);
user1.setNickName("小张")
User user2 = new User();
user2.setName("李四");
user2.setAge(88);
//使用默认的批量插入条数:1000条/次
this.userService.insertBatchWithTemplate(Arrays.asList(user1, user2), template);
//指定批量插入条数
this.userService.insertBatchWithTemplate(Arrays.asList(user1, user2), template, 500);
指定模板方式将使用template这个实例的非null字段去决定插入的字段,使用指定模版方式虽然能尽可能的保证插入字段不会确实,但是也可能会产生和内置方式,导致数据库默认值失效的情况。
每种批量插入方式都有各自的优缺点,需要更具自己项目具体需要来决定使用,没有万能的。