mybatis-plus内置提供了InsertBatchSomeCulumn来实现真批量插入,但是由于只支持MySQL的语法格式,所以没有在通用的API作为默认使用。
@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
public interface UserMapper extends BaseMapper<User> {
Integer insertBatchSomeColumn(List<User> users);
}
其中insertBatchSomeColumn是默认方法名,可以在第1步的配置中指定InsertBatchSomeColumn(String name, Predicate<TableFieldInfo> predicate)方法名。
使用内置方法有一个缺点,不能根据插入实体类是否非空来决定插入的字段列表,为空的会直接插入null值,这就导致了我们在数据库设置的默认是值失效。
1.引入依赖
<dependency>
<groupId>io.github.timoyung</groupId>
<artifactId>mybatis-plus-batch-core</artifactId>
<version>1.1.2</version>
</dependency>
2.实现BatchServiceImpl类
public interface UserService extends IBatchService<User> {
}
@Service
public class UserServiceImpl extends BatchServiceImpl<UserMapper, User> implements UserService {
}
3.使用批量插入方法(默认模板)
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.使用批量插入方法(指定模板)
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字段去决定插入的字段,使用指定模版方式虽然能尽可能的保证插入字段不会确实,但是也可能会产生和内置方式,导致数据库默认值失效的情况。
每种批量插入方式都有各自的优缺点,需要更具自己项目具体需要来决定使用,没有万能的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。