基于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();
            }

        }

    }

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