實現方式比較多,這裏主要說明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();
}
}
}
}