一、用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);
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论