当前位置: 代码网 > it编程>编程语言>Java > 优化MyBatis-Plus批量插入策略方式

优化MyBatis-Plus批量插入策略方式

2026年01月14日 Java 我要评论
一、用mybatis-plus中的savebatch方法mybatis-plus 的 service 层提供了 savebatch 方法,可以方便地实现批量插入操作。但查阅源码发现,savebatch

一、用mybatis-plus中的savebatch方法

mybatis-plus 的 service 层提供了 savebatch 方法,可以方便地实现批量插入操作。但查阅源码发现,savebatch的底层还是逐条插入的,这就会导致当数据量大的时候程序运行效率变慢

import com.baomidou.mybatisplus.extension.service.impl.serviceimpl;
import org.springframework.stereotype.service;
import java.util.list;

// 假设实体类为 user
class user {
    private long id;
    private string name;

    // 构造函数、getter 和 setter 方法
    public user() {}

    public user(long id, string name) {
        this.id = id;
        this.name = name;
    }

    public long getid() {
        return id;
    }

    public void setid(long id) {
        this.id = id;
    }

    public string getname() {
        return name;
    }

    public void setname(string name) {
        this.name = name;
    }
}

// 假设 usermapper 继承自 basemapper
interface usermapper extends com.baomidou.mybatisplus.core.mapper.basemapper<user> {}

// userservice 继承自 serviceimpl
@service
class userservice extends serviceimpl<usermapper, user> {
    public boolean saveuserbatch(list<user> userlist) {
        return this.savebatch(userlist);
    }
}

// 调用示例
public class main {
    public static void main(string[] args) {
        userservice userservice = new userservice();
        java.util.list<user> userlist = new java.util.arraylist<>();
        userlist.add(new user(1l, "alice"));
        userlist.add(new user(2l, "bob"));

        boolean result = userservice.saveuserbatch(userlist);
        if (result) {
            system.out.println("批量插入成功");
        } else {
            system.out.println("批量插入失败");
        }
    }
}

二、insertbatchsomecolumn插件

它继承了abstractmethod类,在 mybatis-plus 中,insertbatchsomecolumn 是一种用于批量插入部分列数据的插入策略,它可以帮助我们在批量插入数据时只插入部分需要的列,而不是插入所有列。

1.使用前配置

首先,确保你的项目中已经添加了 mybatis-plus 和 mysql 驱动的依赖。

如果你使用的是 maven 项目,可以在 pom.xml 中添加以下依赖:

<dependencies>
    <!-- mybatis-plus -->
    <dependency>
        <groupid>com.baomidou</groupid>
        <artifactid>mybatis-plus-boot-starter</artifactid>
        <version>3.5.3.1</version>
    </dependency>
    <!-- mysql 驱动 -->
    <dependency>
        <groupid>mysql</groupid>
        <artifactid>mysql-connector-java</artifactid>
        <version>8.0.32</version>
    </dependency>
</dependencies>

2.代码示例

1.配置类mybatisplusconfig

  • 创建一个自定义的 defaultsqlinjector,并在 getmethodlist 方法中添加 insertbatchsomecolumn 方法,将其注入到 mybatis-plus 中。
import com.baomidou.mybatisplus.core.injector.abstractmethod;
import com.baomidou.mybatisplus.core.injector.defaultsqlinjector;
import com.baomidou.mybatisplus.extension.injector.methods.insertbatchsomecolumn;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

import java.util.list;

@configuration
public class mybatisplusconfig {
    @bean
    public defaultsqlinjector sqlinjector() {
        return new defaultsqlinjector() {
            @override
            public list<abstractmethod> getmethodlist(class<?> mapperclass) {
                list<abstractmethod> methodlist = super.getmethodlist(mapperclass);
                methodlist.add(new insertbatchsomecolumn());
                return methodlist;
            }
        };
    }
}    

2.实体类 user

使用 @tablename 注解指定该实体类对应的数据库表名。

为每个属性提供了对应的 getter 和 setter 方法,这里使用了 lombok 的 @data 注解来自动生成这些方法

ximport com.baomidou.mybatisplus.annotation.tablefield;
import com.baomidou.mybatisplus.annotation.tablename;
import lombok.data;

@data
@tablename("user")
public class user {
    private long id;
    private string name;
    @tablefield("age")
    private integer age;
    private string email;
}    

3.mapper 接口 usermapper

继承自 basemapper,继承了 mybatis-plus 提供的基本 crud 方法。

使用 @insertprovider 注解指定插入方法的 sql 提供者为 insertbatchsomecolumn,并调用其 sql 方法生成 sql 语句。

定义了 insertbatchsomecolumn 方法,用于批量插入部分列数据。

import com.baomidou.mybatisplus.extension.injector.methods.insertbatchsomecolumn;
import com.baomidou.mybatisplus.extension.plugins.inner.sqlparserinner;
import org.apache.ibatis.annotations.insertprovider;
import org.apache.ibatis.annotations.param;
import org.apache.ibatis.builder.annotation.providermethodresolver;

import java.util.list;

public interface usermapper extends basemapper<user>, providermethodresolver {
    @insertprovider(type = insertbatchsomecolumn.class, method = "sql")
    int insertbatchsomecolumn(@param("list") list<user> list);
}    


4.测试类 insertbatchtest

实现 commandlinerunner 接口,在 run 方法中进行测试。 

创建多个 user 对象并添加到列表中。

调用 usermapper 的 insertbatchsomecolumn 方法进行批量插入,并打印插入的行数。

import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.commandlinerunner;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;

import java.util.arraylist;
import java.util.list;

@springbootapplication
public class insertbatchtest implements commandlinerunner {

    @autowired
    private usermapper usermapper;

    public static void main(string[] args) {
        springapplication.run(insertbatchtest.class, args);
    }

    @override
    public void run(string... args) throws exception {
        list<user> userlist = new arraylist<>();
        user user1 = new user();
        user1.setname("alice");
        user1.setage(20);
        userlist.add(user1);

        user user2 = new user();
        user2.setname("bob");
        user2.setage(22);
        userlist.add(user2);

        int rows = usermapper.insertbatchsomecolumn(userlist);
        system.out.println("插入行数: " + rows);
    }
}    
    user2.setname("bob");
    user2.setage(22);
    userlist.add(user2);

    int rows = usermapper.insertbatchsomecolumn(userlist);
    system.out.println("插入行数: " + rows);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com