spring中使用mybatis实现批量插入的示例代码
有3种实现方式:foreach,spring事务,以及ExecutorType.BATCH.
1.foreach方式
这种方式实际是对SQL语句进行拼接,生成一个长长的SQL,对很多变量进行绑定。如果数据量不大(1000个以内),可以用这种方式。如果数据量太大,可能数据库会报错。
定义接口
publicinterfaceStudentMapper05{
publicvoidinsertStudent(ListstudentList);
}
定义mapper
适用于Oracle数据库
BEGIN INSERTINTOtest_student(ID,NAME,BRANCH,PERCENTAGE,PHONE,EMAIL) VALUES (SEQ_ID.nextval,#{student.name},#{student.branch},#{student.percentage},#{student.phone},#{student.email}); END;
这个mapper的含义,就是把上送的studentList拼接成一个长SQL,拼成的SQL类似:
BEGIN INSERTINTOtest_student(ID,NAME,BRANCH,PERCENTAGE,PHONE,EMAIL)VALUES(SEQ_ID.nextval,?,?,?,?,?); INSERTINTOtest_student(ID,NAME,BRANCH,PERCENTAGE,PHONE,EMAIL)VALUES(SEQ_ID.nextval,?,?,?,?,?); INSERTINTOtest_student(ID,NAME,BRANCH,PERCENTAGE,PHONE,EMAIL)VALUES(SEQ_ID.nextval,?,?,?,?,?); ... END;
studentList有几个,就会生成多少个insert语句拼接到一起,每个?都会进行变量绑定,所以当studentList中数据量较多时,生成的SQL会很长,导致数据库执行报错。
dao
publicclassStudentDao05{
privateStudentMapper05studentMapper;//省略getter和setter
publicvoidinsertStudentList(ListstudentList){
studentMapper.insertStudent(studentList);
}
}
beans
mybatis-spring-05.xml:
main函数
publicstaticvoidmain(String[]args){
String[]configFiles=newString[]{"spring-beans-config.xml","mybatis/mybatis-spring-05.xml"};//分别配置datasource和mybatis相关bean
ApplicationContextcontext=newClassPathXmlApplicationContext(configFiles);
StudentDao05studentDao=(StudentDao05)context.getBean("studentDao05");
intcounts[]=newint[]{10,50,100,200,500,1000,2000,3000,5000,8000};
for(intcount:counts){
ListstudentList=newArrayList<>();
for(inti=0;i
测试结果
插入100笔数据耗时:197ms
插入200笔数据耗时:232ms
插入500笔数据耗时:421ms
插入1000笔数据耗时:650ms
插入2000笔数据耗时:1140ms
插入3000笔数据耗时:27113ms
插入5000笔数据耗时:98213ms
插入8000笔数据耗时:301101ms
2.借助spring事务
借助spring事务,插入一组数据
开启spring事务
定义接口
publicinterfaceStudentMapper06{
publicvoidinsertStudent(@Param("student")Studentstudent);
}
mapper
INSERTINTOtest_student(ID,NAME,BRANCH,PERCENTAGE,PHONE,EMAIL)
VALUES
(SEQ_ID.nextval,#{student.name},#{student.branch},#{student.percentage},#{student.phone},#{student.email})
dao
publicclassStudentDao06{
privateStudentMapper06studentMapper;//省略getter和setter
@Transactional//spring事务控制
publicvoidinsertStudentList(Liststudents){
for(Studentstudent:students){
studentMapper.insertStudent(student);
}
}
}
beans
main
略
测试结果
batchInsert001插入10笔数据耗时:602ms
batchInsert001插入50笔数据耗时:196ms
batchInsert001插入100笔数据耗时:284ms
batchInsert001插入200笔数据耗时:438ms
batchInsert001插入500笔数据耗时:944ms
batchInsert001插入1000笔数据耗时:1689ms
batchInsert001插入2000笔数据耗时:3138ms
batchInsert001插入3000笔数据耗时:4427ms
batchInsert001插入5000笔数据耗时:7368ms
batchInsert001插入8000笔数据耗时:11832ms
3.使用ExecutorType.BATCH
基本原理是SqlSessionsqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH,false);,设置BATCH方式的sqlSession
有三种设置方式:
3.1在mybatis的config文件中设置
SqlSessionFactoryBean中可以配置配置文件:
这个mybatis配置文件中,设置BATCH方式:
这样,默认打开的sqlSession就都是BATCH方式的。再与spring的事务结合(参看上一节中的spring事务设置),就可以实现批量插入。
测试结果:
batchInsert001插入10笔数据耗时:565ms
batchInsert001插入50笔数据耗时:117ms
batchInsert001插入100笔数据耗时:98ms
batchInsert001插入200笔数据耗时:106ms
batchInsert001插入500笔数据耗时:145ms
batchInsert001插入1000笔数据耗时:132ms
batchInsert001插入2000笔数据耗时:154ms
batchInsert001插入3000笔数据耗时:163ms
batchInsert001插入5000笔数据耗时:200ms
batchInsert001插入8000笔数据耗时:250ms
3.2自己创建sqlSession,手工commit
SqlSessionFactorysqlSessionFactory=(SqlSessionFactory)context.getBean("sqlSessionFactory");
SqlSessionsqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH,false);
StudentMapper06studentMapper=sqlSession.getMapper(StudentMapper06.class);
for(inti=0;i
测试结果:
batchInsert002插入10笔数据耗时:568ms
batchInsert002插入50笔数据耗时:157ms
batchInsert002插入100笔数据耗时:132ms
batchInsert002插入200笔数据耗时:135ms
batchInsert002插入500笔数据耗时:148ms
batchInsert002插入1000笔数据耗时:139ms
batchInsert002插入2000笔数据耗时:151ms
batchInsert002插入3000笔数据耗时:139ms
batchInsert002插入5000笔数据耗时:207ms
batchInsert002插入8000笔数据耗时:299ms
3.3使用sqlSessionTemplate在XML文件中创建bean
创建一个SqlSessionTemplate,然后注入到MapperFactoryBean中,生成对应的mapper:
与spring的事务结合后(参看上一节中的spring事务设置),就可以实现批量插入
测试结果
batchInsert003插入10笔数据耗时:651ms
batchInsert003插入50笔数据耗时:133ms
batchInsert003插入100笔数据耗时:124ms
batchInsert003插入200笔数据耗时:129ms
batchInsert003插入500笔数据耗时:144ms
batchInsert003插入1000笔数据耗时:179ms
batchInsert003插入2000笔数据耗时:229ms
batchInsert003插入3000笔数据耗时:241ms
batchInsert003插入5000笔数据耗时:216ms
batchInsert003插入8000笔数据耗时:259ms
到此这篇关于spring中使用mybatis实现批量插入的示例代码的文章就介绍到这了,更多相关springmybatis批量插入内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。