MyBatisとSpringを組み合わせたバッチ・ソリューション

5104 ワード

MyBatisとSpringを組み合わせたバッチ・ソリューション
参考URL:
http://www.mybatis.org/mybatis-dynamic-sql/docs/insert.html
https://blog.csdn.net/zxy_9264_ang/articale/detail/93844849
https://blog.csdn.net/artaganan8/article/details/88624402
https://blog.csdn.net/huanghanqian/article/details/83177178
https://blog.csdn.net/qq_1503505/articale/detail/80428249
1、Sql Sessionを作成する
SqlSessionFactory    Spring   ,     ExecutorType.BATCH,        ,   SqlSessionFactory openSession   
2、rewriteBatch tementsを設定する
jdbcの住所につづり合わせる。 jdbc:mysql://127.0.0.1:3306/project?rewriteBatchedStatements=true 
3、バッチ処理
一回のサイクルで直接走り終わらないと、何回もバッファリングします。
4、処理結果の取得
   sqlSession.flushStatements()           
5、sql Sessionを閉じる
package cn.xxx.partner.maintainsite.dao;

import cn.xxx.partner.maintainsite.entity.MaintainSiteBasicEntity;
import cn.xxx.partner.maintainsite.mapper.MaintainSiteUpdateMapper;
import org.apache.ibatis.executor.BatchResult;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author GaoMingBo
 * @since 2019-09-02 16:19
 */
@Repository
public class MaintainSiteBatchDao {

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    private SqlSession sqlSession;
    
    @PostConstruct
    public void init() {
        //         sql session,      
        sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
    }
    
    public String batchUpdate(String statementMapper, List> params, Integer group) {
        List batchResults = new ArrayList<>();
        //     1000 ,    ,      
        group = (group == null || group == 0) ? 1000 : group;
        int batchSize = 0;
        for (Map param : params) {
            sqlSession.update(statementMapper, param);
            batchSize++;
            if (batchSize == group) {
                batchResults.addAll(sqlSession.flushStatements());
                batchSize = 0;
            }
        }
        if (batchSize > 0) {
            batchResults.addAll(sqlSession.flushStatements());
        }
        return assembleBatchResults(batchResults);
    }

    /**
     *       
     *
     * @param entityList     
     * @param group          --        
     * @return       
     */
    public String batchUpdate(List entityList, Integer group) {
        //    Mapper
        MaintainSiteUpdateMapper siteMapper =     sqlSession.getMapper(MaintainSiteUpdateMapper.class);
        List results = new ArrayList<>();
        //     1000 ,    ,      
        group = (group == null || group == 0) ? 1000 : group;
        int batchSize = 0;
        try {
            for (MaintainSiteBasicEntity entity : entityList) {
                siteMapper.updateByPrimaryKeySelective(entity);
                batchSize++;
                if (batchSize == group) {
                    //   SQL  
                    results.addAll(sqlSession.flushStatements());
                    batchSize = 0;
                }
            }
            if (batchSize > 0) {
                //   SQL  
                results.addAll(sqlSession.flushStatements());
            }
            //     
            sqlSession.commit();
        } catch (Exception e) {
            //     
            sqlSession.rollback();
        } finally {
            //   SqlSession
            sqlSession.close();
        }
        //           
        return assembleBatchResults(results);
    }

    /**
     *         
     *
     * @param results      
     * @return       
     */
    private String assembleBatchResults(List results) {
        if (results.size() > 0) {
            StringBuilder sb = new StringBuilder();
            sb.append("      :
"); for (int i = 0; i < results.size(); i++) { BatchResult result = results.get(i); sb.append(" ").append(i + 1).append(" :\t"); sb.append(result.getSql().replaceAll("
", "") .replaceAll("\\s+", " ")).append("\t"); sb.append(" : ").append(findSumWithoutUsingStream(result.getUpdateCounts())).append("
"); } return sb.toString(); } else { return null; } } /** * * * @param array int * @return */ private static int findSumWithoutUsingStream(int[] array) { int sum = 0; for (int value : array) { sum += value; } return sum; } }