文章目录
1.获取Bean的工具类
java
/**
* @author Linging
* @version 1.0.0
* @since 1.0
*/
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext = applicationContext;
}
public static Object getBean(String name){
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> tClass){
return applicationContext.getBean(tClass);
}
}
2.批量提交工具类
java
/**
* @author Linging
* @version 1.0.0
* @since 1.0
*/
public class BatchUtils {
public final static Integer COUNT = 100;
public static <T,E> void execute(List<T> list, Class<E> tClass, BiConsumer<T, E> biConsumer){
SqlSessionTemplate sqlSessionTemplate = SpringUtils.getBean(SqlSessionTemplate.class);
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
E mapper = sqlSession.getMapper(tClass);
try{
int n = 0;
for (T data : list) {
n++;
biConsumer.accept(data, mapper);
if(n >= COUNT){
sqlSession.commit();
n = 0;
}
}
sqlSession.commit();
sqlSessionTemplate.clearCache();
}catch (Exception e){
sqlSession.rollback();
throw new RuntimeException("批量执行出错", e);
}finally {
sqlSession.close();
}
}
public static <T,E> void executeList(List<T> list, Class<E> tClass, BiConsumer<List<T>, E> biConsumer){
SqlSessionTemplate sqlSessionTemplate = SpringUtils.getBean(SqlSessionTemplate.class);
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
E mapper = sqlSession.getMapper(tClass);
try{
// 使用Google的guaua工具类:Lists
List<List<T>> allList = Lists.partition(list, COUNT);
for (List<T> subList : allList) {
biConsumer.accept(subList, mapper);
sqlSession.commit();
}
sqlSessionTemplate.clearCache();
}catch (Exception e){
sqlSession.rollback();
throw new RuntimeException("批量执行出错", e);
}finally {
sqlSession.close();
}
}
}
3.使用
java
@Transactional
public void add() {
List<Student> students = new ArrayList<>();
Student st1 = new Student();
st1.setId(5L);
st1.setName("赵云");
st1.setAge(20);
st1.setAddress("");
st1.setPhone("");
Student st2 = new Student();
st2.setId(6L);
st2.setName("极效满");
st2.setAge(30);
st2.setAddress("");
st2.setPhone("");
Student st3 = new Student();
st3.setId(7L);
st3.setName("黄棕");
st3.setAge(99);
st3.setAddress("");
st3.setPhone("");
students.add(st1);
students.add(st2);
students.add(st3);
BatchUtils.execute(students, StudentMapper.class, ((student, studentMapper2) -> {
studentMapper2.insert(student);
}));
}