Mybatis批量提交實(shí)現(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中加入
<!-- 配置一個(gè)可以批量執(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實(shí)現(xiàn)中添加:
@Autowired
private SqlSession sqlSession;
//批量保存員工
@Override
public Integer batchEmp() {
// TODO Auto-generated method stub
//批量保存執(zhí)行前時(shí)間
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í)行后的時(shí)間
System.out.println("執(zhí)行時(shí)長"+time2);
return (int) time2;
}
demo:
@Test //批量保存方法測試
public void testBatch() throws IOException{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
//可以執(zhí)行批量操作的sqlSession
SqlSession openSession=sqlSessionFactory.openSession(ExecutorType.BATCH);
//批量保存執(zhí)行前時(shí)間
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í)行后的時(shí)間
System.out.println("執(zhí)行時(shí)長"+(end-start));
//批量 預(yù)編譯sql一次==》設(shè)置參數(shù)==》10000次==》執(zhí)行1次 677
//非批量 (預(yù)編譯=設(shè)置參數(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
方式二、需要開啟事務(wù)提交,在applcationContext.xml中添加BATCH
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x)
這篇文章主要介紹了intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java實(shí)現(xiàn)把窗體隱藏到系統(tǒng)托盤方法
這篇文章主要介紹了Java實(shí)現(xiàn)把窗體隱藏到系統(tǒng)托盤方法,本文直接給出核心功能代碼,需要的朋友可以參考下2015-05-05
Java Swing JTextArea文本區(qū)域的實(shí)現(xiàn)示例
這篇文章主要介紹了Java Swing JTextArea文本區(qū)域的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
java 用泛型參數(shù)類型構(gòu)造數(shù)組詳解及實(shí)例
這篇文章主要介紹了java 用泛型參數(shù)類型構(gòu)造數(shù)組詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢
這篇文章主要介紹了Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
帶有@Transactional和@Async的循環(huán)依賴問題的解決
這篇文章主要介紹了帶有@Transactional和@Async的循環(huán)依賴問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

