Mybatis-plus---的批量插入

这篇具有很好参考价值的文章主要介绍了Mybatis-plus---的批量插入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mybatisplus批量插入,mybatis,java,spring


批量插入

一、继承IService(伪批量)

二、insertBatchSomeColumn


Mybatis-plus很强,为我们诞生了极简CURD操作,但对于数据批量操作,显然默认提供的insert方法是不够看的了,于是它和它来了!!! Mybatis-plus提供的两种插入方式

        继承IService(伪批量)

        insertBatchSomeColumn 

一、继承IService(伪批量)

在Mapper继承BaseMapper<T>

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.UserStudy;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserStudyMapper extends BaseMapper<UserStudy> {
}

在Service中继承IService<T>

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.UserStudy;

/********************************************************************************
 ** @author : ZYJ
 ** @date :2023/04/20
 ** @description :厂长老婆催的睡觉了-批量插入Service
 *********************************************************************************/
public interface UserStudyService extends IService<UserStudy> {

}

在Service实现类继承ServiceImpl<M,T>

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.UserStudy;
import com.example.demo.mapper.UserStudyMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/********************************************************************************
 ** @author : ZYJ
 ** @date :2023/04/04
 ** @description :厂长加班写代码-批量插入
 *********************************************************************************/
@Service
public class UserStudyServiceImpl extends ServiceImpl<UserStudyMapper, UserStudy> implements UserStudyService {

    @Resource
    private UserStudyMapper userStudyMapper;

}

测试代码,调用IService的saveBatch方法

    /*
     *批量插入
     */
    @Override
    public void greatMany() {
        List<UserStudy> userStudyList = new ArrayList<>();
        UserStudy userStudy1 = new UserStudy();
        userStudy1.setName("张三");
        UserStudy userStudy2 = new UserStudy();
        userStudy2.setName("李四");
        userStudyList.add(userStudy1);
        userStudyList.add(userStudy2);
        //调用IService的saveBatch方法
        this.saveBatch(userStudyList);
    }

Mybatis-plus的SQL日志打印在配置文件application.yml配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
#    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl #关闭sql日志

测试结果,代码执行打印了两条SQL,所以可以看得出saveBatch底层也是遍历循环完成 

mybatisplus批量插入,mybatis,java,spring

saveBatch方法分析

底层也是通过for来完成,默认是一个事务一次提交1000条数据,点击进入saveBatch可以看到, 也可以自定义每次提交多少条,自定义如下

        //调用IService的saveBatch方法
        this.saveBatch(userStudyList,2000);

二、insertBatchSomeColumn

自定义SQL注入器

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;

/********************************************************************************
 ** @author : ZYJ
 ** @date :2023/03/09
 ** @description :厂长加班写代码-批量插入SQL注入器
 *********************************************************************************/
public class InsertBatchSqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        methodList.add(new InsertBatchSomeColumn()); //添加InsertBatchSomeColumn方法
        return methodList;
    }
}

把SQL注入器交给Spring

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class MybatisPlusConfig {
    /********************************************************************************
     ** @author : ZYJ
     ** @date :2023/04/14
     ** @description :注入配置
     *********************************************************************************/
    @Bean
    public InsertBatchSqlInjector easySqlInjector () {
        return new InsertBatchSqlInjector();
    }
}

到此定义完毕,在Mapper中生成insertBatchSomeColumn(必须是这个方法名)方法,你就可以撒手不管了,直接调用就行,或者直接在ServiceImpl通过Mapper调用insertBatchSomeColumn,然后ALT+回车生成此方法。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.UserStudy;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserStudyMapper extends BaseMapper<UserStudy> {
    void insertBatchSomeColumn(@Param("list") List<UserStudy> userStudyList);
}

测试代码,调用insertBatchSomeColumn方法

    @Resource
    private UserStudyMapper userStudyMapper;

    /*
     *批量插入
     */
    @Override
    public void greatMany() {
        List<UserStudy> userStudyList = new ArrayList<>();
        UserStudy userStudy1 = new UserStudy();
        userStudy1.setName("张三");
        UserStudy userStudy2 = new UserStudy();
        userStudy2.setName("李四");
        userStudyList.add(userStudy1);
        userStudyList.add(userStudy2);
        //调用insertBatchSomeColumn方法
        userStudyMapper.insertBatchSomeColumn(userStudyList);
        //调用IService的saveBatch方法
        //this.saveBatch(userStudyList,2000);
    }

测试结果,代码执行打印一条SQL,所以可以看出是一条SQL便新增完成

mybatisplus批量插入,mybatis,java,spring

注意:SQL有语句长度限制,在MySQL中被参数max_allowed_packet限制,默认为1M,如果拼接长度超过此限制就会报错,两种解决方式,一个是调整MySQL的max_allowed_packet 限制,另一个则是通过代码控制每次的提交数量。

通过代码控制每次提交数量,模拟造五条数据,每次提交两条数据

    /*
     *批量插入
     */
    @Override
    public void greatMany() {
        List<UserStudy> userStudyList = new ArrayList<>();
        UserStudy userStudy1 = new UserStudy();
        userStudy1.setName("张三");
        UserStudy userStudy2 = new UserStudy();
        userStudy2.setName("李四");
        UserStudy userStudy3 = new UserStudy();
        userStudy3.setName("王五");
        UserStudy userStudy4 = new UserStudy();
        userStudy4.setName("赵六");
        UserStudy userStudy5 = new UserStudy();
        userStudy5.setName("小红");
        userStudyList.add(userStudy1);
        userStudyList.add(userStudy2);
        userStudyList.add(userStudy3);
        userStudyList.add(userStudy4);
        userStudyList.add(userStudy5);
        //创建入库的list
        List<UserStudy> userStudyCount = new ArrayList<>();
        for (int i = 0; i < userStudyList.size(); i++) {
            //调用insertBatchSomeColumn方法
            userStudyCount.add(userStudyList.get(i));
            //控制每次提交数量
            if(userStudyCount.size()==2){
                userStudyMapper.insertBatchSomeColumn(userStudyCount);
                //将入库的list清空重新新增
                userStudyCount.clear();
            }
        }
        //将list中size不够2的数据在此处新增
        userStudyMapper.insertBatchSomeColumn(userStudyCount);
        //调用IService的saveBatch方法
        //this.saveBatch(userStudyList,2000);
    }

结果分析,五条数据应该请求三次新增,打印三条SQL,完美结束

mybatisplus批量插入,mybatis,java,spring

总结:默认的insert的方法对寻常业务来说是非常之高效,但对于批量数据的产生确实灾难性的,就是慢,很慢,巨慢,IService的saveBatch方法优于默认的insert方法,但是我选通过SQL注入器的方法insertBatchSomeColumn。文章来源地址https://www.toymoban.com/news/detail-560067.html

到了这里,关于Mybatis-plus---的批量插入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • No Spring环境Mybatis-Plus批量插入并返回主键的两种方式

    批量插入,可以把Mybatis-Plus看作是Mybatis加强版;故Mybatis中的相关操作都可以在Mybatis-Plus中使用;在mysql数据库中支持批量插入,所以只要配置useGeneratedKeys和keyProperty就可以批量插入并返回主键了。 下面是批量插入的Dao层接口    一注解方式:      直接撸代码:      第二种: XML方

    2024年02月09日
    浏览(35)
  • MyBatis-Plus 引入依赖导致的Error creating bean和java.lang.NoClassDefFoundError: com/baomidou/mybatisplus问题

     使用mybatis-plus出现的一些问题记录。 问题错误截图 问题原因: 依赖冲突 项目主pom文件中引入了mybatis-plus-boot-start依赖,版本为 3.5.3 业务包中引入mybatis-plus代码生成器依赖版本为 3.4.1 导致mybatis-plus-core核心包存在两个版本,导致冲突   解决办法 修改业务包中mybatis-plus代码

    2024年02月09日
    浏览(53)
  • Mybatis-plus批量操作

            使用Mybatis-plus可以很方便的实现批量新增和批量修改,不仅比自己写foreach遍历方便很多,而且性能也更加优秀。但是Mybatis-plus官方提供的批量修改和批量新增都是根据id来修改的,有时候我们需求其他字段,所以就需要我们自己修改一下。         在Mybatis-plus的IS

    2024年02月11日
    浏览(41)
  • Mybatis-Plus批量更新原理

    IService的updateBatchById方法 默认batchSize = 1000 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#updateBatchById 构建了一个回调,进入executeBatch方法 在这个方法基本就能看出来了,执行1000次方法后执行一次flushStatements,也就是说理论上是积累了1000个更新sql,才进行一次数据库更新 使用

    2024年02月05日
    浏览(51)
  • mybatis-plus的批量新增insertBatchSomeColumn

    MyBatis-Plus 是基于 MyBatis 进行封装的一套优秀的持久层框架,它提供了丰富的便捷操作方法和强大的代码生成器,大大简化了 MyBatis 的使用。在 MyBatis-Plus 中,我们可以使用 insertBatchSomeColumn 方法来实现批量新增指定字段的操作。 mybatis-plus 的  IService 接口  默认提供   saveBat

    2024年02月01日
    浏览(42)
  • mybatis-plus批量保存异常及效率优化

    最近基于自己公司内部服务维护,发现其中调度中心近期出现不少错误日志,但是该任务却是正常执行,生成的报表数据也是正常的,所以很多天没有发现问题 这就匪夷所思了,    经仔细排查发现,是触发了feign超时hystrix熔断器机制 也就是说子服务出现了执行时间过长的

    2024年01月16日
    浏览(35)
  • mybatis-plus 根据指定字段 批量 删除/修改

    mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办) 这个就不说了,就是因为不想手写SQL 所以才有这篇博客 mybatis plus 的 executeBatch 参考 mybatis plus 的updateBatchById 方法. 调用处: 接口 重写方法 实现 这种写法其实批量的效率还是比较慢的

    2024年02月13日
    浏览(41)
  • spring boot集成mybatis-plus——Mybatis Plus 批量 Insert_新增数据(图文讲解)

     更新时间 2023-01-10 16:02:58 大家好,我是小哈。 本小节中,我们将学习如何通过 Mybatis Plus 实现 MySQL 批量插入数据。 先抛出一个问题:假设老板给你下了个任务,向数据库中添加 100 万条数据,并且不能耗时太久! 通常来说,我们向 MySQL 中新增一条记录,SQL 语句类似如下:

    2024年02月04日
    浏览(50)
  • Mybatis-plus通过其他字段批量更新或新增

    根据某个或者多个非ID字段进行批量更新 示例通过名称与id两个字段更新 引用mybatis-plus根据某个指定字段批量更新数据库 通过其他字段批量更新或新增

    2024年02月12日
    浏览(50)
  • Mybatis-Plus 自定义mapper批量新增修改函数

    version MybatisPlusConfig CustomizedSqlInjector InsertBatchMethod UpdateBatchMethod RootMapper 使用方式 mapper接口实现自定义的RootMapper,即可调用批量新增修改函数

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包