簡介:mybatis的批量操作減少數據庫連接次數
-
一、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中加入
<!-- 配置一個可以批量執行的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實現中添加:
@Autowired
private SqlSession sqlSession;
//批量保存員工
@Override
public Integer batchEmp() {
// TODO Auto-generated method stub
//批量保存執行前時間
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;
//批量保存執行后的時間
System.out.println("執行時長"+time2);
return (int) time2;
}
demo:
@Test //批量保存方法測試 public void testBatch() throws IOException{ SqlSessionFactory sqlSessionFactory=getSqlSessionFactory(); //可以執行批量操作的sqlSession SqlSession openSession=sqlSessionFactory.openSession(ExecutorType.BATCH); //批量保存執行前時間 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(); //批量保存執行后的時間 System.out.println("執行時長"+(end-start)); //批量 預編譯sql一次==》設置參數==》10000次==》執行1次 677 //非批量 (預編譯=設置參數=執行 )==》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>
三、總結:
方式一、需要修改數據庫屬性添加allowMutiQueries=true,例如:jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true
方式二、需要開啟事務提交,在applcationContext.xml中添加BATCH