基於SqlSessionFactory的Mybatis批量更新

實現方式比較多,這裏主要說明sqlSessionFactory實現的批量更新

1. 首先建一個spring工具類

  • 用來自定義獲取Mapper類
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @author yanghao
 * @version SpringContextUtil.java, v 0.1 2019-09-02 17:22
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }

    public static Object getBean(Class T){
        try {
            return applicationContext.getBean(T);
        }catch (BeansException e){
            return null;
        }
    }

    public static Object getBean(String name){
        try {
            return applicationContext.getBean(name);
        }catch (BeansException e){
            return null;
        }
    }

}

2. 然後是批量更新邏輯

  • 入參換成自己的對象列表
  • 更改獲取自己需要Mapper類
  • 單條更新方法自己編寫(批量提交)
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

/**
 * @author yanghao
 * @version BatchUpdate.java, v 0.1 2019-09-02 17:24
 */
@Slf4j
public class BatchUpdate {

    /**
     * 提交數量,到達這個數量就提交
     */
    private static int BATCH_COUNT = 1000;

    /**
     * 標籤排序批量更新
     * @param list(T可以換成自己的要更新的對象)
     * @return  
     */
    public static <T extends Object> void update(List<T> list){
        if(list ==null || list.size() <= 0){
            throw new Exception("更新數據不能爲空");
        }

        SqlSessionFactory sqlSessionFactory = (SqlSessionFactory)SpringContextUtil.getBean("sqlSessionFactory");
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
            //Mapper是自己編寫或者生成的mapper文件
            Mapper mapper = sqlSession.getMapper(Mapper.class);
            for (int index = 0; index < list.size(); index++) {
                //單條更新,批量提交(調用自己寫好的單條更新方法)
                mapper.update(list.get(index));

                if(index != 0 && index%BATCH_COUNT == 0){
                    //每1000條提交一次
                    sqlSession.commit();
                }
            }

            //最後不足1000的數據提交
            sqlSession.commit();

        }catch (Exception e){
            log.error("批量數據更新異常 >> list = {}, error = {}", JSON.toJSONString(list), ExceptionUtils.getStackTrace(e));
            sqlSession.rollback();

            throw new Exception("批量更新異常");

        }finally {
            if(sqlSession != null){
                sqlSession.close();
            }

        }

    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章