时间:2021-05-19
有3种实现方式:foreach,spring事务,以及ExecutorType.BATCH.
1. foreach方式
这种方式实际是对SQL语句进行拼接,生成一个长长的SQL,对很多变量进行绑定。如果数据量不大(1000个以内),可以用这种方式。如果数据量太大,可能数据库会报错。
定义接口
定义mapper
适用于Oracle数据库
<insert id="insertStudent"> BEGIN <foreach collection="list" item="student" index="index" separator=""> INSERT INTO test_student(ID, NAME, BRANCH, PERCENTAGE, PHONE, EMAIL) VALUES (SEQ_ID.nextval, #{student.name}, #{student.branch}, #{student.percentage}, #{student.phone}, #{student.email}); </foreach> END;</insert>这个mapper的含义,就是把上送的studentList拼接成一个长SQL,拼成的SQL类似:
BEGININSERT INTO test_student(ID, NAME, BRANCH, PERCENTAGE, PHONE, EMAIL) VALUES (SEQ_ID.nextval, ?, ?, ?, ?, ?);INSERT INTO test_student(ID, NAME, BRANCH, PERCENTAGE, PHONE, EMAIL) VALUES (SEQ_ID.nextval, ?, ?, ?, ?, ?);INSERT INTO test_student(ID, NAME, BRANCH, PERCENTAGE, PHONE, EMAIL) VALUES (SEQ_ID.nextval, ?, ?, ?, ?, ?);...END;studentList有几个,就会生成多少个insert语句拼接到一起,每个?都会进行变量绑定,所以当studentList中数据量较多时,生成的SQL会很长,导致数据库执行报错。
dao
beans
mybatis-spring-05.xml:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="oracleDataSource" /> <property name="configLocation" value="classpath:mybatis/config/mybatis-config-05.xml"/></bean><bean id="studentMapper05" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.ws.experiment.spring.mybatis.mapper.StudentMapper05" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean><bean id="studentDao05" class="com.ws.experiment.spring.mybatis.dao.StudentDao05"> <property name="studentMapper" ref="studentMapper05" /></bean>main函数
测试结果
插入100笔数据耗时: 197 ms
插入200笔数据耗时: 232 ms
插入500笔数据耗时: 421 ms
插入1000笔数据耗时: 650 ms
插入2000笔数据耗时: 1140 ms
插入3000笔数据耗时: 27113 ms
插入5000笔数据耗时: 98213 ms
插入8000笔数据耗时: 301101 ms
2. 借助spring事务
借助spring事务,插入一组数据
开启spring事务
定义接口
mapper
dao
beans
main
略
测试结果
batchInsert001插入10笔数据耗时: 602 ms
batchInsert001插入50笔数据耗时: 196 ms
batchInsert001插入100笔数据耗时: 284 ms
batchInsert001插入200笔数据耗时: 438 ms
batchInsert001插入500笔数据耗时: 944 ms
batchInsert001插入1000笔数据耗时: 1689 ms
batchInsert001插入2000笔数据耗时: 3138 ms
batchInsert001插入3000笔数据耗时: 4427 ms
batchInsert001插入5000笔数据耗时: 7368 ms
batchInsert001插入8000笔数据耗时: 11832 ms
3. 使用ExecutorType.BATCH
基本原理是SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);,设置BATCH方式的sqlSession
有三种设置方式:
3.1 在mybatis的config文件中设置
SqlSessionFactoryBean中可以配置配置文件:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="oracleDataSource" /> <property name="configLocation" value="classpath:mybatis/config/mybatis-config-06.xml"/></bean>这个mybatis配置文件中,设置BATCH方式:
<configuration> <settings> <!-- 默认打开BATCH的Executor --> <setting name="defaultExecutorType" value="BATCH" /> </settings> <mappers> <mapper class="com.ws.experiment.spring.mybatis.mapper.StudentMapper06" /> </mappers></configuration>这样,默认打开的sqlSession就都是BATCH方式的。再与spring的事务结合(参看上一节中的spring事务设置),就可以实现批量插入。
测试结果:
batchInsert001插入10笔数据耗时: 565 ms
batchInsert001插入50笔数据耗时: 117 ms
batchInsert001插入100笔数据耗时: 98 ms
batchInsert001插入200笔数据耗时: 106 ms
batchInsert001插入500笔数据耗时: 145 ms
batchInsert001插入1000笔数据耗时: 132 ms
batchInsert001插入2000笔数据耗时: 154 ms
batchInsert001插入3000笔数据耗时: 163 ms
batchInsert001插入5000笔数据耗时: 200 ms
batchInsert001插入8000笔数据耗时: 250 ms
3.2 自己创建sqlSession,手工commit
测试结果:
batchInsert002插入10笔数据耗时: 568 ms
batchInsert002插入50笔数据耗时: 157 ms
batchInsert002插入100笔数据耗时: 132 ms
batchInsert002插入200笔数据耗时: 135 ms
batchInsert002插入500笔数据耗时: 148 ms
batchInsert002插入1000笔数据耗时: 139 ms
batchInsert002插入2000笔数据耗时: 151 ms
batchInsert002插入3000笔数据耗时: 139 ms
batchInsert002插入5000笔数据耗时: 207 ms
batchInsert002插入8000笔数据耗时: 299 ms
3.3 使用sqlSessionTemplate在XML文件中创建bean
创建一个SqlSessionTemplate,然后注入到MapperFactoryBean中,生成对应的mapper:
<!-- 以ExecutorType.BATCH方式插入数据库 --><bean id="batchSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" /> <constructor-arg name="executorType" value="BATCH" /></bean><bean id="studentMapper06_batch" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.ws.experiment.spring.mybatis.mapper.StudentMapper06" /> <property name="sqlSessionTemplate" ref="batchSqlSessionTemplate" /></bean><bean id="studentDao06_batch" class="com.ws.experiment.spring.mybatis.dao.StudentDao06"> <property name="studentMapper" ref="studentMapper06_batch" /></bean>与spring的事务结合后(参看上一节中的spring事务设置),就可以实现批量插入
测试结果
batchInsert003插入10笔数据耗时: 651 ms
batchInsert003插入50笔数据耗时: 133 ms
batchInsert003插入100笔数据耗时: 124 ms
batchInsert003插入200笔数据耗时: 129 ms
batchInsert003插入500笔数据耗时: 144 ms
batchInsert003插入1000笔数据耗时: 179 ms
batchInsert003插入2000笔数据耗时: 229 ms
batchInsert003插入3000笔数据耗时: 241 ms
batchInsert003插入5000笔数据耗时: 216 ms
batchInsert003插入8000笔数据耗时: 259 ms
到此这篇关于spring中使用mybatis实现批量插入的示例代码的文章就介绍到这了,更多相关spring mybatis批量插入内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Mybatis批量插入返回影响的行数环境:postgresql9.6.5spring4.1mybatis3junit4log4jThesisMapper.xml
在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入
在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入
由于项目中需要使用批量插入功能,所以在网上查找到了Redis批量插入可以使用pipeline来高效的插入,示例代码如下:Stringkey="key";Jedi
导入mybatis依赖org.mybatis.spring.bootmybatis-spring-boot-starter2.0.1yml实现mybatis依赖