mybatis 批量提交


簡介: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM