这篇文章主要介绍了mybatis怎么样批量插入大量数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下:

packagecom.lcy.service.mapper;importcom.lcy.service.pojo.TestVO;importorg.apache.ibatis.annotations.Insert;importjava.util.List;publicinterfaceTestMapper{@Insert("")IntegertestBatchInsert(Listlist);}

实体类:

packagecom.lcy.service.pojo;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublicclassTestVO{privateStringt1;privateStringt2;privateStringt3;privateStringt4;privateStringt5;}

测试类如下:

importcom.lcy.service.TestApplication;importcom.lcy.service.mapper.TestMapper;importcom.lcy.service.pojo.TestVO;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;importjava.util.ArrayList;importjava.util.List;@SpringBootTest(classes=TestApplication.class)@RunWith(SpringRunner.class)publicclassTestDemo{@AutowiredprivateTestMappertestMapper;@Testpublicvoidinsert(){Listlist=newArrayList<>();for(inti=0;i<200000;i++){list.add(newTestVO(i+","+i,i+","+i,i+","+i,i+","+i,i+","+i));}System.out.println(testMapper.testBatchInsert(list));}}

为了复现bug,我限制了JVM内存:


执行测试类报错如下:

java.lang.OutOfMemoryError: Java heap space

at java.base/java.util.Arrays.copyOf(Arrays.java:3746)

可以看到,Arrays在申请内存的时候,导致栈内存溢出

改进方法,分批新增:

importcom.lcy.service.TestApplication;importcom.lcy.service.mapper.TestMapper;importcom.lcy.service.pojo.TestVO;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;importjavax.swing.*;importjava.util.ArrayList;importjava.util.List;importjava.util.stream.Collectors;@SpringBootTest(classes=TestApplication.class)@RunWith(SpringRunner.class)publicclassTestDemo{@AutowiredprivateTestMappertestMapper;@Testpublicvoidinsert(){Listlist=newArrayList<>();for(inti=0;i<200000;i++){list.add(newTestVO(i+","+i,i+","+i,i+","+i,i+","+i,i+","+i));}intindex=list.size()/10000;for(inti=0;i<index;i++){//stream流表达式,skip表示跳过前i*10000条记录,limit表示读取当前流的前10000条记录testMapper.testBatchInsert(list.stream().skip(i*10000).limit(10000).collect(Collectors.toList()));}}}

还有一种方法是调高JVM内存,不过不建议使用,不仅吃内存,而且数据量过大会导致sql过长报错

感谢你能够认真阅读完这篇文章,希望小编分享的“mybatis怎么样批量插入大量数据”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!