精华内容
下载资源
问答
  • MyBatis-Plus 批量插入

    2020-11-17 14:36:14
    MyBatis-Plus 批量插入 环境: spring boot+mybatis plus BaseMapper未提供批量插入接口,但是在com.baomidou.mybatisplus.service.IService中提供了 /** * <p> * 插入(批量),该方法不适合 Oracle * <...

    MyBatis-Plus 批量插入

    环境:
    spring boot+mybatis plus

    BaseMapper未提供批量插入接口,但是在com.baomidou.mybatisplus.service.IService中提供了

    /**
     * <p>
     * 插入(批量),该方法不适合 Oracle
     * </p>
     *
     * @param entityList 实体对象列表
     * @return boolean
     */
    boolean insertBatch(List<T> entityList);
    
    /**
     * <p>
     * 插入(批量)
     * </p>
     *
     * @param entityList 实体对象列表
     * @param batchSize  插入批次数量
     * @return boolean
     */
    boolean insertBatch(List<T> entityList, int batchSize);
    

    使用方法,定义一个自己的service接口,继承IService,泛型为被操作实体类

    public interface AddressService  extends IService<Address> {
        void insertAddressBath(List<Address> address);
    }
    

    定义一个实现类,实现接口

    @Service
    public class AddressServiceImpl extends ServiceImpl<AddressMapper, Address> implements AddressService {
    
        @Resource
        private AddressMapper addressMapper;
    
        public void insertAddressBath(List<Address> addressList) {
            
    
        }
    }
    

    正常使用:

    List<Address> addressList = JSON.parseArray(jsonAddr,Address.class);
    addressService.saveBatch(addressList );
    

    好了 成功

    参考:https://blog.csdn.net/leisure_life/article/details/98976565

    展开全文
  • [转]Mybatis-plus批量插入、批量修改数据saveBatch等速度缓慢背景处理 Arebirth博客园: 原文链接 背景 使用mysqlPlus. 不管是updateBatch, 还是saveBatch, 800条左右的数据, 耗时都超过1s以上 尝试更改每次批量...

    [转]Mybatis-plus批量插入、批量修改数据saveBatch等速度缓慢

    Arebirth博客园: 原文链接

    背景

    使用mysqlPlus. 不管是updateBatch, 还是saveBatch, 800条左右的数据,
    耗时都超过1s以上

    尝试更改每次批量处理的数量, 比如:

    super.updateBatchById(list,1000);
    

    如果不传第二个参数, mysqlPlus默认是1000. 这个根据调整, 发现低于1000, 耗时增加,15002500ms左右, 因为sql分多次执行, 中间IO请求的耗时比较大.
    设置为1000(因为总共测试数据都没有1000, 所以没有尝试更大的值), 为900ms到1200ms左右.

    这时间太久了,在网上找办法.

    处理

    最后发现在sql链接后追加: rewriteBatchedStatements=true. 再次尝试, 已经缩减到100ms!

     url: jdbc:mysql://localhost:3306/zgd?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true
    
    

    在这里插入图片描述

    展开全文
  • mybatis-plus批量插入InsertBatchSomeColumn

    千次阅读 2021-02-03 14:22:01
    mybatis-plus批量insert效率低下怎么办 (数据库是mysql的情况下) mybatis-plus的顶级IService接口有一个saveBatch()方法, 但是它会执行多条insertSql, 在数据量大的时候效率会非常差, 如果我们是mysql数据库,...

    mybatis-plus批量insert效率低下怎么办

    (数据库是mysql的情况下)

    mybatis-plus的顶级IService接口有一个saveBatch()方法,
    但是它会执行多条insertSql,
    在数据量大的时候效率会非常差,

    如果我们是mysql数据库,又不想自己写mapper.xml,
    mybatis-plus提供了InsertBatchSomeColumn批量insert方法,
    需要我们自己注入下。

    1、继承DefaultSqlInjector

    package com.superv.message.common.mybatisplus;
    
    import java.util.List;
    
    import com.baomidou.mybatisplus.core.injector.AbstractMethod;
    import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
    import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
    
    public class EasySqlInjector extends DefaultSqlInjector {
    
    	@Override
    	public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
    		// TODO Auto-generated method stub
    		List<AbstractMethod> methodList = super.getMethodList(mapperClass);
    		methodList.add(new InsertBatchSomeColumn()); // 添加InsertBatchSomeColumn方法
    		return methodList;
    	}
    	
    }
    

    2、注入到spring容器

    package com.superv.message.common.mybatisplus;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MybatisPlusConfig {
    
    	@Bean
    	public EasySqlInjector easySqlInjector () {
    		return new EasySqlInjector();
    	}
    	
    }
    

    3、在我们的mapper.java中这样

    package com.superv.message.mapper;
    
    import java.util.Collection;
    import java.util.List;
    
    import org.apache.ibatis.annotations.Mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.superv.message.entity.Message;
    
    @Mapper
    public interface MessageMapper extends BaseMapper<Message> {
    
    	/**
    	 * 批量插入(mysql)
    	 * @param entityList
    	 * @return
    	 */
    	Integer insertBatchSomeColumn(Collection<Message> entityList);
    	
    }
    

    不需要再去写mapper.xml,直接调用这个方法就可以批量保存了,

    它是这样执行的:
    insert into table values (x1, y1, z1), (x2, y2, z2), (x…, y…, z…);

    参考资料:

    盛夏温暖流年Mybatis Plus 实现批量插入
    Java旺给你的MyBatis-Plus装上批量插入的翅膀

    展开全文
  • mybatis-plus 批量插入saveBacth入坑过程 == 熊大== 背景: 每天定时从sftp上下载文件,解析文件组装参数然后批量入库,方便数据组抽数。 sftp上共五个文件其中有两个文件内容可能超过几百万而数据库是mysql...

    记 mybatis-plus 批量插入saveBacth入坑过程

                                == 熊大==
    
    背景:
    • 每天定时从sftp上下载文件,解析文件组装参数然后批量入库,方便数据组抽数。
    sftp上共五个文件其中有两个文件内容可能超过几百万而数据库是mysql所以决定分表。
    •  按天分表结果就是表太多而且又浪费空间嫌疑所以pass。
      
    •  按月分表程序运行一年后会导致单表数据过多所以也不符合pass。
      
    • 按年月分表是比较符合业务需求并且不会太浪费空间所以决定按年月分表。
      
    技术选择:
    • 技术:sharding-jdbc、mybatis-plus
      
    • 数据库:mysql
      
    • 开发工具:idea
      
    • 调优工具:JProfiler
      
    因为我们要批量插入所以用mybatis-plus自带的saveBatch方法。那为啥批量插入不用单条insert呢?
    是因为一个批次插入只需要一次提交从而减少了io、网络消耗。而单条插入则相当于多次提交也就是说增加了更多的io、网络消耗。
    解决办法

    再次执行查看表每次递增数量:

    入坑:
    首先:自测放款文件。
    代码如下: ` @Override
    public void saveBatch() {
        StopWatch stopWatch1=new StopWatch();
        stopWatch1.start();
        batchLoanCheckFileHistoryServiceImpl.saveBatch(list());
        stopWatch1.stop();
        log.info("===========放款文件每批次插入耗时为{}",stopWatch1.getTotalTimeMillis());
        loanList.clear();
    }`
    
    每批次插入时间如下在这里插入图片描述
    由日志可见每批次插入数据库时间为300-400毫秒之间(一个批次是1000条)一秒钟大概就是3000左右
    其中在组织参数时候需要查询数据库理论来讲还可以接受。
    逾期文件(大概370万得数据)
    代码如下: @Override
    public void saveBatch() {
        StopWatch stopWatch1=new StopWatch();
        stopWatch1.start();
        batchOverdueCustomerActualPaymentFileImpl.saveBatch(list());
    
        stopWatch1.stop();
        log.info("===========逾期文件落库{}",stopWatch1.getTotalTimeMillis());
        overdueCustomer.clear();
    }
    
    每批次插入时间如下:在这里插入图片描述
    两次文件落库时间对比图如下:在这里插入图片描述
    通过对比发现逾期每批次落库时间竟然是放款的十几倍而且落库时间竟然高达5,6秒但是代码几乎一致为啥这个插入这么慢呢!是可忍孰不可忍,于是借助工具JProfiler进行调休看下运行时候到底哪里占用了时间。
    (和idea集成请看博客link)
    于是我又运行了下如图所示在这里插入图片描述
    有图可见我在组织参数时候用了cn.hutool.core.date.DateUtil.parse这个方法而这个方法竟然占用了20%得时间于是我将他改成了简单时间转换SimpleDateFormate。
    修改后运行如下图:在这里插入图片描述
    替换之后入库时间少了但是仍然在3-4秒之间仍然不能接受但是信心大增。
    于是我再次运行使用神器JProfiler如下图:在这里插入图片描述
    在组织参数时候竟然消耗了8%难道是字段过多反射消耗得性能。我内心窃喜于是采取了
    如下操作:
    • 暂时删除点字段和放款表字段数量保持一致
      
    • 修改表得引擎由InnoDB改成(存储引擎)MYISAM
      
    每批次插入时间如下图:在这里插入图片描述
    发现时间只是减少了一点点结果仍然是不可以接受。

    仰天长叹太难了。

    此时灵光一现又做了如下操作:
    • 用loan文件与逾期文件插入时候做对比
      
    • 对比看下sql执行过程
      
    配置文件填上log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    放款文件sql执行如下图:在这里插入图片描述
    因内容较长原谅我不能完全贴出来发现他是一次性提交插入得。
    逾期文件sql执行如下图:在这里插入图片描述
    虽然代码几乎一样,但是插入时候完全不一样。逾期批次插入时候竟然不是每批次1000条插入得为啥呢?虽然此时仍然不知道为什么但是需要验证两个问题。
    • plus自带得saveBatch是否有问题.
    • 在插入得过程究竟是不是没批次1000条插入得。
    • 在saveBatch得时候是不是传过去1000条。
    首先验证第二个问题如下图:在这里插入图片描述
    发现他的确不是按每批次1000条插入得。那是不是版本得问题呢。于是升级了版本由3.2---->3.4
    然并软:仍然不是按每批次1000条插入得为什么呢?
    深吸一口气,准备放大招debug,在debug的时候发现在这里插入图片描述
    源码标红的地方会对比两个sql是否一致如果不一致则走进else将Statement加入到Statement集合中最后插入时候如下图注释

    在这里插入图片描述

    那么逾期文件落库的时候是否sql不一致呢于是我重新运行如下在这里插入图片描述
    细心得人会发现这两个inser语句是不一样得比如第二个insert语句payment_date是有值得而第一个是没有得。也就是说是因为解析文件时有的列无值造成的原因那只要批量插入得时候每个sql保持一致就行。只需要在可能为空得列上添加@TableField(insertStrategy = FieldStrategy.IGNORED,fill = FieldFill.DEFAULT)(不知道是否有的兄弟跟我一样遇到过这个坑)
    然后运行如下图:在这里插入图片描述

    到此优化结束符合我们的预期。

    结论:

    虽然我每次传入了1000条但是sql不一致将不同的Statement加入集合插入的时候则遍历这个集合从而导致insert多次。
    解决办法:
    • 在可能为空的列上添加
      @TableField(insertStrategy=FieldStrategy.IGNORED,
      fill = FieldFill.DEFAULT)
      
    展开全文
  • MyBatis-Plus(简称MP)是一个MyBatis的增强工具,旨在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。 特点 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:...
  • 最近小编手上一堆项目,实在特别忙,每天一堆批量操作,更新、导入、新增、删除,公司使用的Mybatis-Plus操作SQL,用过Mybatis-Plus的小伙伴一定知道他有很多API提供给我们使用,真爽,再不用写那么多繁琐的SQL语句...
  • 对于批量插入mybatis-plus提供了相应的API实现: boolean saveBatch(Collection<T> entityList, int batchSize); 参数entityList为需要批量插入的数据的集合;参数batchSize为批处理大小,表示将传入的...
  • mybatis plus 中提供了相应的接口,来实现批量插入和删除数据 1 批量删除数据 mybatis plus 对应的service 接口中有个removeByIds() 接口,来删除多个数据,按照id 进行删除,我们可以将要删除的id 放入List集合中...
  • 什么是MyBatis-Plus? 翻译过来就是“加强的mybatis”;封装了各种方法,形成了类似于JPA的使用方式。有兴趣的朋友参考文档:MyBatis-Plus SpringBoot集合方式 1.添加以下依赖(注:包含MyBatis的依赖) <...
  • mysql数据库批量插入、批处理插入数据、提升数据插入速度 rewriteBatchedStatements=true
  • 问题发生:导入excel文件时导入接口运行时间很长,大概1600条,格式见下图 在数据格式全部正确的情况下该接口在postman的运行时间在2分10秒,想办法优化。 ... 上面是在sql链接后追加: rewriteBatchedStatements=true...
  • 引言 食用此文章的前提:学习了Spring、学习了Mybatis-plus 正文 使用 mybatis-plus 时在控制台输出SQL语句的配置项是: ...mybatis-plus批量插入方法 saveBatch 在实现的时候,似乎是逐条插.
  • mybatis-plus_batch_insert:mybatis_plus添加批量插入
  • spring boot+mybatis plus环境,单条插入用的是BaseMapper自带的insert方法 public ApiResult addAnc(Anc anc) { ApiResult result = new ApiResult(); Integer insert = ancMapper.insert(anc); if (insert &...
  • 使用mybatis-plus进行批量插入的时NPE org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0 com.baomidou mybatis-plus-boot-starte...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,912
精华内容 1,164
关键字:

mybatis-plus批量插入