Mybatis 批量保存优化 - 仅适用于MySQL

223 阅读1分钟
  1. 创建自定义数据方法注入类
package com.wsh.util;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.additional.InsertBatchSomeColumn;

import java.util.List;


public class EasySqlInjector extends DefaultSqlInjector {

 @Override
 public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
     // 防止父类方法不可用
     List<AbstractMethod> methodList = super.getMethodList(mapperClass);
     methodList.add(new InsertBatchSomeColumn());
     return methodList;
 }
}

  1. 在MybatisPlus配置文件MybatisPlusConfig加入自定义

import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import com.wsh.util.EasySqlInjector;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;


@EnableTransactionManagement
@Configuration
@MapperScan("com.wsh.mapper")
public class MybatisPlusConfig {

    @Bean
    public EasySqlInjector easySqlInjector(){
        return new EasySqlInjector();
    }
}

  1. 扩展通用Mapper,支持数据批量插入,即:创建EasyBaseMapper接口继承BaseMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.Collection;

/**
 * @author suahng
 * @date 2021-07-21 20:47
 * @dec
 */
public interface EasyBaseMapper<T> extends BaseMapper<T> {


    /**
     * 批量插入,仅使用批量插入
     * @param entityList 实体列表
     * @return 影响行数
     */
    Integer insertBatchSomeColumn(Collection<T> entityList);
}

  1. 定义业务mapper接口,继承刚刚扩展的EasyBaseMapper
import com.wsh.entity.Order;
import org.springframework.stereotype.Repository;

@Repository
public interface EasyMapper extends EasyBaseMapper<Order> {
}

  1. 定义Service接口

import com.baomidou.mybatisplus.extension.service.IService;
import com.wsh.entity.Order;

import java.util.Collection;


public interface EasyService extends IService<Order> {

    /**
     * 批量插入,仅适用于 mysql
     * @param orderList
     * @return
     */
    public Integer BatchSave(Collection<Order> orderList);
}

  1. 定义service接口的实现类

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wsh.mapper.EasyBaseMapper;
import com.wsh.mapper.EasyMapper;
import com.wsh.entity.Order;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collection;


@Service
public class EasyServiceImpl extends ServiceImpl<EasyMapper, Order> implements EasyService{



    @Override
    public Integer BatchSave(Collection<Order> orderList) {
        return baseMapper.insertBatchSomeColumn(orderList);
    }
}

7: 批量插入测试


import com.wsh.entity.Order;
import com.wsh.service.EasyServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;

@SpringBootTest
public class TestEasyService {

    @Resource
    EasyServiceImpl easyService;

    @Test
    public void testBatchSave(){

        long start = System.currentTimeMillis();

        ArrayList<Order> orders = new ArrayList<>();

        for (int i = 0; i < 100000; i++) {

            Order order = new Order();
            order.setName("hcy"+i);
            order.setOrderDate(new Date());
            orders.add(order);
        }

        Integer b = easyService.BatchSave(orders);
        long end = System.currentTimeMillis();
        System.out.println("保存时间为:" + (end - start));//6348 6093 4320
        System.out.println(b);
    }
}

mybatis-saveBatch方法:

f9b02f22e28ac0cf82d829b06f7e985.png

自定义 batchSave 方法:

image.png

文章原作者:CSDN-大江东去wsh 文章原地址:blog.csdn.net/m0_48847558…