目的:写一个通用的mapper工具操作类,增加sql执行效率并减少开发人员减少多余的代码编写,使代码更加简洁
方法名:
单参数操作: batchOperationSingleParam(List<T> list, Class<M> clazz, BiConsumer<M, T> biConsumer) 多参数操作: batchOperationMoreParam(List<T> list, Class<M> clazz, BiConsumer<M, List<T>> biConsumer)
数据批量操作工具类 :
package com.skynet.datahup.utils; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson2.JSON; import com.skynet.common.core.utils.DateUtils; import com.skynet.common.core.utils.SpringUtils; import com.skynet.datahup.translatedata.domain.*; import com.skynet.datahup.translatedata.mapper.*; import com.skynet.datahup.yqdatasync.domain.SmsDomain; import com.skynet.datahup.yqdatasync.mapper.SmsMapper; import com.xxl.job.core.context.XxlJobHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; @Component @Slf4j public class SkynetDataBatchOperationUtils { /** * * @param list 批量操作对象 * @param clazz * @param biConsumer mapper方法,方法参数为单个Object * @param <M> * @param <T> */ public static <M, T> void batchOperationSingleParam(List<T> list, Class<M> clazz, BiConsumer<M, T> biConsumer) { if (list == null || list.size() == 0) { log.info("SkynetDataBatchOperationUtils batchInsert list data is null!"); return; } SqlSessionFactory sqlSessionFactory = SpringUtil.getBean(SqlSessionFactory.class); SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); try { M mapper = session.getMapper(clazz); list.forEach(a -> { try { biConsumer.accept(mapper, a); } catch (Exception e) { log.error("错误数据:{}", a.toString()); e.printStackTrace(); } }); session.commit(); session.clearCache(); } catch (Exception e) { e.printStackTrace(); log.error("SkynetDataBatchOperationUtils batchInsert is exception!clazz={}", clazz.getName(), e); session.rollback(); } finally { session.close(); } } /** * * @param list 批量操作对象 * @param clazz * @param biConsumer mapper方法,方法参数为List<T> * @param <T> * @return * @throws Exception * @Description: 防止一次执行的sql过长,数据每次50条分批执行 */ public static <M, T> int batchOperationMoreParam(List<T> list, Class<M> clazz, BiConsumer<M, List<T>> biConsumer) throws Exception { if (CollectionUtils.isEmpty(list)) { log.info("SkynetDataBatchOperationUtils batchInsertOrUpdate list data is null!"); return 0; } SqlSessionFactory sqlSessionFactory = SpringUtil.getBean(SqlSessionFactory.class); SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); try { M mapper = session.getMapper(clazz); List<T> batch = new ArrayList<>(); int allSize = list.size(); long start = System.currentTimeMillis(); for (T data : list) { batch.add(data); if (batch.size() >= 50 || batch.size() == allSize) { // 入库 try { biConsumer.accept(mapper, batch); allSize = allSize - 50; } catch (Exception e) { log.error("SkynetDataBatchOperationUtils batchInsertOrUpdate is exception!clazz={}", clazz.getName(), e); log.error("错误数据:{}"+data.toString()); session.rollback(); e.printStackTrace(); throw new RuntimeException(e.getMessage()); } batch.clear(); } } session.commit(); session.clearCache(); } catch (Exception e) { log.error("SkynetDataBatchOperationUtils batchInsertOrUpdate is exception!clazz={}", clazz.getName(), e); // e.printStackTrace(); session.rollback(); throw new RuntimeException(e.getMessage()); } finally { session.close(); } return list.size(); } }
方法调用:
单参数操作:
List<YwWarnGlDomain> phoneWarnings = new ArrayList<>();
SkynetDataBatchOperationUtils.batchOperationSingleParam(gjPhoneWarnings, GjPhoneWarnMapper.class, GjPhoneWarnMapper::insertGjPhoneWarn);
多参数操作:
List<YwWarnGlDomain> netwarnDomains = new ArrayList<>();
.......
.......
SkynetDataBatchOperationUtils.batchOperationMoreParam(ywWarnCzjls, YwWarnCzjlMapper.class,YwWarnCzjlMapper::insertBatch);
mapper内方法
/**
* 插入一条数据
*
* @param gjPhoneWarn 插入的数据
*/
public int insertGjPhoneWarn(GjPhoneWarn gjPhoneWarn);
/**
* @param list 需要批量插入的数据
* 批量插入
*/
public int insertBatch(@Param("entities") List<YwWarnGlDomain> list);