mybatis批量insert数据动态表明(mysql批量insert正确方式) -k8体育

数据库使用的是sqlserver,jdk版本1.8,运行在springboot环境下 对比3种可用的方式

  • 反复执行单条插入语句
  • xml拼接sql
  • 批处理执行

先说结论:少量插入请使用反复插入单条数据,方便。数量较多请使用批处理方式。(可以考虑以有需求的插入数据量20条左右为界吧,在我的测试和数据库环境下耗时都是百毫秒级的,方便最重要)。

无论何时都不用xml拼接sql的方式。

newid()是sqlserver生成uuid的函数,与本文内容无关


    insert into tb_item values
    
        (newid(),#{item.uniquecode},#{item.projectid},#{item.name},#{item.type},#{item.packageunique},
        #{item.ispackage},#{item.factoryid},#{item.projectname},#{item.spec},#{item.length},#{item.weight},
        #{item.material},#{item.setupposition},#{item.areaposition},#{item.bottomheight},#{item.topheight},
        #{item.serialnumber},#{item.createtime}
mapper接口mapper 是 mybatis插件tk.mapper 的接口,与本文内容关系不大
public interface itemmapper extends mapper {
    int insertbybatch(list itemlist);
}

service类

@service
public class itemservice {
    @autowired
    private itemmapper itemmapper;
    @autowired
    private sqlsessionfactory sqlsessionfactory;
    //批处理
    @transactional
    public void add(list itemlist) {
        sqlsession session = sqlsessionfactory.opensession(executortype.batch,false);
        itemmapper mapper = session.getmapper(itemmapper.class);
        for (int i = 0; i < itemlist.size(); i  ) {
            mapper.insertselective(itemlist.get(i));
            if(i00==999){//每1000条提交一次防止内存溢出
                session.commit();
                session.clearcache();
            }
        }
        session.commit();
        session.clearcache();
    }
    //拼接sql
    @transactional
    public void add1(list itemlist) {
        itemlist.insertbybatch(itemmapper::insertselective);
    }
    //循环插入
    @transactional
    public void add2(list itemlist) {
        itemlist.foreach(itemmapper::insertselective);
    }
}

测试类

@runwith(springrunner.class)
@springboottest(webenvironment = springboottest.webenvironment.random_port, classes = applicationboot.class)
public class itemservicetest {
    @autowired
    itemservice itemservice;
    private list itemlist = new arraylist<>();
    //生成测试list
    @before 
    public void createlist(){
        string json ="{n"  
                "        "areaposition": "test",n"  
                "        "bottomheight": 5,n"  
                "        "factoryid": "0",n"  
                "        "length": 233.233,n"  
                "        "material": "q345b",n"  
                "        "name": "test",n"  
                "        "package": false,n"  
                "        "packageunique": "45f8a0ba0bf048839df85f32ebe5bb81",n"  
                "        "projectid": "094b5eb5e0384bb1aaa822880a428b6d",n"  
                "        "projectname": "项目_test1",n"  
                "        "serialnumber": "1/2",n"  
                "        "setupposition": "1b柱",n"  
                "        "spec": "200x200x200",n"  
                "        "topheight": 10,n"  
                "        "type": "steel",n"  
                "        "uniquecode": "12344312",n"  
                "        "weight": 100n"  
                "    }";
        item test1 = json.parseobject(json,item.class);
        test1.setcreatetime(new date());
        for (int i = 0; i < 1000; i  ) {//测试会修改此数量
            itemlist.add(test1);
        }
    }
     //批处理
    @test
    @transactional
    public void tesinsert() {
        itemservice.add(itemlist);
    }
    //拼接字符串
    @test
    @transactional
    public void testinsert1(){
        itemservice.add1(itemlist);
    }
    //循环插入
    @test
    @transactional
    public void testinsert2(){
        itemservice.add2(itemlist);
    }
}

测试结果:

10条 25条数据插入经多次测试,波动性较大,但基本都在百毫秒级别

mybatis三种批量插入方式的比较,我推荐第3个

其中 拼接sql方式在插入500条和1000条时报错(似乎是因为sql语句过长,此条跟数据库类型有关,未做其他数据库的测试):com.microsoft.sqlserver.jdbc.sqlserverexception: 传入的表格格式数据流(tds)远程过程调用(rpc)协议流不正确,此rpc请求中提供了过多的参数,最多应为2100

可以发现

  • 循环插入的时间复杂度是 o(n),并且常数c很大
  • 拼接sql插入的时间复杂度(应该)是 o(logn),但是成功完成次数不多,不确定
  • 批处理的效率的时间复杂度是 o(logn),并且常数c也比较小

循环插入单条数据虽然效率极低,但是代码量极少,在使用tk.mapper的插件情况下,仅需代码,:

@transactional
public void add1(list itemlist) {
    itemlist.foreach(itemmapper::insertselective);
}

因此,在需求插入数据数量不多的情况下肯定用它了。

xml拼接sql是最不推荐的方式,使用时有大段的xml和sql语句要写,很容易出错,工作效率很低。更关键点是,虽然效率尚可,但是真正需要效率的时候你挂了,要你何用?

批处理执行是有大数据量插入时推荐的做法,使用起来也比较方便。

(0)
仰望辉煌。  的头像仰望辉煌。  

相关推荐

  • 大家好,我是银行的一名苦逼的柜员,根据自己的工作经验,给大家分享一下去银行开立基本户的流程是什么。 首先,公司的负责人需要电话、网上或者去柜面预约开户,当你向银行提出开户申请时,工…

    2022年3月16日
  • 斗图真是令人欲罢不能的聊天经历。如果说一场聊天下来没有表情出现,整段对话是索然寡味的。但有限的表情包撑不起多场次的反复使用,通用型表情不够个性,怎么办?今天就隆重推荐一款斗图神器,…

  • 在感情生活中,两个人是否能融洽相处,三观相符很重要,如果三观不合,在相处过程中经常会出现争吵与矛盾,那么怎么判断两个人三观合不合呢?在日常生活中,可以从以下几方面表现出来。 一、不…

  • 笔记本电脑摄像头无法使用怎么办?win10系统电脑笔记本摄像头不能打开该如何解决?请看下文介绍。 操作步骤: 首先,右键点击“此电脑”,然后再点“属性”。 接着,进去之后,再点“设…

  • 一个小小的杯子也能显示出生活的点滴品质,生活要有滋有味,喝水也要变得有趣味 s’well 保温杯 s’well藉由可重复使用的时尚保温瓶,减少人们对pet瓶的使用量,让…

  • 衡量一个人成功的标志,不是看他登到顶峰的高度,而是看他跌到低谷的反弹力。——小乔治·史密斯·巴顿 过去几年,移动互联网大潮呼啸而过。作为弄潮儿,大姨妈可谓被资本簇拥,星光环绕。 2…

    创业分享 2022年1月18日
  • 上月初,小编分享过一期《iphone太空人动态壁纸下载》,受到不少小伙伴们的欢迎。今天,芝麻科技讯继续分享一期超酷的海贼王动态壁纸下载,感兴趣的朋友,不妨一起来了解下。 与太空人动…

  • 在最近的wwdc 2020开发者大会上,苹果开发团队使用ipad对《神界:原罪2》决定版进行了演示,这似乎预示着《神界:原罪2》即将登陆ipad平台。 《神界:原罪2》是一款由拉瑞…

  • 疫情期间,在线办公 、远程协作、直播教学成为「 手机录屏 」最常见的应用场景。 无论是上课的老师,还是手游爱好者,亦或是app测评人,录制手机操作、直播课堂………

  • 营领科技说 一键将 word、ppt、pdf、excel 等 office 文档转换为图片的 一款神器 1 首先说明:word是不支持直接将word转换为图片的 直接将word转换…

  • 身边有好几个做财务的朋友,每次都听他们抱怨:自己做的是高风险的工作,说不定哪天你就带着水果去看我了。据统计,每年因税收问题被判刑的老板将近8000人。企业的风险80%来源于财务风险…

  • 院校简介: 维多利亚大学是加拿大一所顶尖的大学,建立于1963年,位于不列颠哥伦比亚省的首府维多利亚市。该校为学生和教师都提供了富饶和扶持的学习社区。其一流的研究,激发性的教学和社…

  • 在工作中,多条件求和也是经常需要使用的公式,今天我们来学习sumifs函数的使用技巧 1、sumifs正常用法 公式的用法很简单: sumifs(求和区域,条件区域一,条件一,条件…

  • 随着各大运动品牌的兴起,运动鞋也成为了主流,而在选购上,面对这么多的运动鞋品牌该如何选择呢? “中老年喜欢国货,年轻人却爱穿耐克”,且不说这一特别现象是蓄意调侃还是真实存在,可以肯…

  • 2020年,我国开展了第7次人口普查,2021年5月11日,第七次全国人口普查结果公布,全国人口共1411778724人。 第七次人口普查结果,广东和山东遥遥领先,两省人口依旧保持…

发表回复

登录后才能评论
网站地图