Mybatis批量提交實現(xiàn)步驟詳解
簡介:mybatis的批量操作減少數(shù)據(jù)庫連接次數(shù)
一、mapper 使用foreach 遍歷
批量insert:
<insert id="addEmpsBatch">
INSERT INTO emp(ename,gender,email,did)
VALUES
<foreach collection="emps" item="emp" separator=",">
(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</foreach>
</insert>
批量update:
<update id="updateNewStock" parameterType="java.util.List">
<foreach collection="list" item="bean" index="index" open="" close="" separator=";">
UPDATE green_beans
<set>
stock=#{bean.stock}
</set>
<where>
beanUid = #{bean.beanUid}
</where>
</foreach>
</update>
二、使用 mybatis ExecutorType.BATCH
使用步驟:
(1)在全局配置文件applcationContext.xml中加入
<!-- 配置一個可以批量執(zhí)行的sqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
<constructor-arg name="executorType" value="BATCH"></constructor-arg>
</bean>
(2)在service實現(xiàn)中添加:
@Autowired
private SqlSession sqlSession;
//批量保存員工
@Override
public Integer batchEmp() {
// TODO Auto-generated method stub
//批量保存執(zhí)行前時間
long start=System.currentTimeMillis();
EmployeeMapper mapper= sqlSession.getMapper(EmployeeMapper.class);
for (int i = 0; i < 10000; i++) {
mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0,5),"b","1"));
}
long end= System.currentTimeMillis();
long time2= end-start;
//批量保存執(zhí)行后的時間
System.out.println("執(zhí)行時長"+time2);
return (int) time2;
}
demo:
@Test //批量保存方法測試
public void testBatch() throws IOException{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
//可以執(zhí)行批量操作的sqlSession
SqlSession openSession=sqlSessionFactory.openSession(ExecutorType.BATCH);
//批量保存執(zhí)行前時間
long start=System.currentTimeMillis();
try{
EmployeeMapper mapper= openSession.getMapper(EmployeeMapper.class);
for (int i = 0; i < 1000; i++) {
mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0,5),"b","1"));
}
openSession.commit();
long end= System.currentTimeMillis();
//批量保存執(zhí)行后的時間
System.out.println("執(zhí)行時長"+(end-start));
//批量 預編譯sql一次==》設置參數(shù)==》10000次==》執(zhí)行1次 677
//非批量 (預編譯=設置參數(shù)=執(zhí)行 )==》10000次 1121
}finally{
openSession.close();
}
}
mapper:
public interface EmployeeMapper {
//批量保存員工
public Long addEmp(Employee employee);
}
mapper.xml :
<mapper namespace="com.agesun.mybatis.dao.EmployeeMapper"
<!--批量保存員工 -->
<insert id="addEmp">
insert into employee(lastName,email,gender)
values(#{lastName},#{email},#{gender})
</insert>
</mapper>
三、總結(jié):
方式一、需要修改數(shù)據(jù)庫屬性添加allowMutiQueries=true,例如:jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true
方式二、需要開啟事務提交,在applcationContext.xml中添加BATCH
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
spring事務@Transactional失效原因及解決辦法小結(jié)
今天就跟大家聊聊有關(guān)spring中@Transactional失效原因及解決辦法小結(jié),主要從三個方面考慮,具有一定的參考價值,感興趣的可以了解一下2023-08-08
詳解springboot + profile(不同環(huán)境讀取不同配置)
本篇文章主要介紹了springboot + profile(不同環(huán)境讀取不同配置),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
關(guān)于SpringBoot配置文件application.properties的路徑問題
這篇文章主要介紹了關(guān)于SpringBoot配置文件application.properties的路徑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

