package com.dj.springtest.config;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import java.util.List;
/**
* User: ldj
* Date: 2023/7/13
* Time: 23:40
* Description: 自定义Sql注入器,只要类 ? extends AbstractMethod,就可以在BaserMapper的基础上,就可以拓展自定义的
* 方法类,其中InsertBatchSomeColumn 是mybatis plus帮我们做好的,因为它底层是拼接sql,不同的数据库sql脚本有些许不一样,目前
* 只在mysql测试过,所以官方没有将它暴露给我们直接使用,二是让我们自己进行扩展
*/
public class CustomSqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
}
package com.dj.springtest.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* User: ldj
* Date: 2023/7/13
* Time: 23:34
* Description: No Description
*/
@Configuration
public class MybatisPlusConfig {
@Bean
@ConditionalOnMissingBean(CustomSqlInjector.class)
public CustomSqlInjector customSqlInjector() {
return new CustomSqlInjector();
}
}
package com.dj.springtest.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* User: ldj
* Date: 2023/7/13
* Time: 23:33
* Description: 拓展Mapper,暴露方法insertBatchSomeColumn()
*/
public interface RootMapper<T> extends BaseMapper<T> {
Integer insertBatchSomeColumn(List<T> entityList);
//解决大数据插入,insertBatchSomeColumn报错问题
default void saveBatchByList(List<T> list, Integer subSize) {
List<T> arrayList = null;
for (int beginIndex = 0; beginIndex < list.size(); beginIndex += subSize) {
int endIndex = Math.min(beginIndex + subSize, list.size());
arrayList = list.subList(beginIndex, endIndex);
insertBatchSomeColumn(arrayList);
//arrayList.clear(); //有bug 插入数据大概会丢失1/3
}
assert arrayList != null;
arrayList.clear();
}
}
使用:
测试:
package com.dj.springtest;
import com.dj.springtest.mapper.UserMapper;
import com.dj.springtest.model.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
class SpringTestApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List<User> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUsername("ldj" + i);
user.setAge(18 + i);
user.setPassword("155255wretr");
user.setMobile("15582060");
list.add(user);
}
System.out.println(list.size());
userMapper.saveBatchByList(list, 3);
}
}