前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >真正的mybatis-plus批量插入(Mysql语法)

真正的mybatis-plus批量插入(Mysql语法)

原创
作者头像
用户1448294
发布2023-10-27 21:46:23
2.9K0
发布2023-10-27 21:46:23
举报
文章被收录于专栏:实用小工具分享

一、使用mybatis-plus内置批量插入

mybatis-plus内置提供了InsertBatchSomeCulumn来实现真批量插入,但是由于只支持MySQL的语法格式,所以没有在通用的API作为默认使用。

  1. 将InsertBatchSomeCulumn实例放入Sqlnjector列表中
代码语言:java
复制
    @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字段去决定插入的字段,使用指定模版方式虽然能尽可能的保证插入字段不会确实,但是也可能会产生和内置方式,导致数据库默认值失效的情况。

每种批量插入方式都有各自的优缺点,需要更具自己项目具体需要来决定使用,没有万能的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、使用mybatis-plus内置批量插入
  • 二、使用第三方实现
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档