mybatisPlus实现真实批量插入操作
场景:在实际使用中发现mybaitsPlus的批量插入方法,并没有实现真正的批量插入,而是不断遍历循环插入;问题:如何实现真实批量插入?解决:1、方法一:在数据库连接配置文件中,使用rewriteBatchedStatements=true测试结果:速度确实有所提高,但是耗时仍然还是比较大2、方法二:直接采用手写sql的方式:import cn.mindgd.domain.WarehouseDet
·
场景:
在实际使用中发现mybaitsPlus的批量插入方法,并没有实现真正的批量插入,而是不断遍历循环插入;
问题:
如何实现真实批量插入?
解决:
1、方法一:
在数据库连接配置文件中,使用rewriteBatchedStatements=true
测试结果:速度确实有所提高,但是耗时仍然还是比较大
2、方法二:
直接采用手写sql的方式:
import cn.mindgd.domain.WarehouseDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface WarehouseDetailMapper extends BaseMapper<WarehouseDetail> {
@Insert("<script>" +
"INSERT INTO warehouse_detail(warehouse_record_id,material_id,a_number,b_number)VALUES" +
"<foreach collection='warehouseDetails' item='warehouseDetail' separator=','> " +
"(#{warehouseDetail.warehouseRecordId},#{warehouseDetail.materialId},#{warehouseDetail.aNumber},#{warehouseDetail.bNumber})" +
"</foreach> " +
"</script>")//批量建议手写sql
boolean insertBatch(@Param("warehouseDetails") List<WarehouseDetail> warehouseDetails);
}
效率很高
3、方法三:
导入pom依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.0</version>
</dependency>
1)创建配置类:
import com.example.bootmybatisplus.injector.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.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
//需要注入的Bean
@Bean
public EasysqlInjector easysqlInjector() {
return new EasysqlInjector();
}
}
2)创建注入器,替代mybatisPlus默认的sql规则,因为mybatisPlus要适应多种数据库,采用默认通用策略,所以mysql针对性的批量操作并没有开启;
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;
public class EasysqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
}
3)创建通用mapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
public interface EasyBaseMapper<T> extends BaseMapper<T> {
/**
* 批量插入 仅适用于MysqL
* @param entityList 实体列表
* @return 影响行数
*/
Integer insertBatchSomeColumn(List<T> entityList);
}
我们自定的mapper类以前是继承BaseMapper,而现在要继承EasyBaseMapper ;如下:
对应service写法:
测试结果:10万数据速度提高了5倍之多;
更多推荐
所有评论(0)