java批量更新或插入工具类

目的:写一个通用的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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的MyBatis批量插入数据的工具类: ``` public class BatchInsertUtil { private static final int BATCH_SIZE = 1000; public static <T> void batchInsert(List<T> dataList, SqlSession sqlSession, String statement) { if (dataList == null || dataList.isEmpty()) { return; } int size = dataList.size(); int batchCount = size % BATCH_SIZE == 0 ? size / BATCH_SIZE : size / BATCH_SIZE + 1; int startIndex, endIndex; for (int i = 0; i < batchCount; i++) { startIndex = i * BATCH_SIZE; endIndex = Math.min((i + 1) * BATCH_SIZE, size); List<T> subList = dataList.subList(startIndex, endIndex); sqlSession.insert(statement, subList); } sqlSession.flushStatements(); } } ``` 使用方法如下: ``` SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); try { BatchInsertUtil.batchInsert(dataList, sqlSession, "com.example.mapper.insertBatch"); sqlSession.commit(); } catch (Exception e) { sqlSession.rollback(); } finally { sqlSession.close(); } ``` 其中,`dataList`为待插入的数据列表,`sqlSession`为MyBatis的`SqlSession`对象,`statement`为对应的Mapper方法名称。要使用该工具类,需要在Mapper文件中定义对应的批量插入方法,例如: ``` <insert id="insertBatch" parameterType="java.util.List"> insert into my_table (column1, column2, column3) values <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}, #{item.column3}) </foreach> </insert> ``` 该方法使用了MyBatis的`foreach`标签,将数据列表中的每一个元素都插入到数据库中。由于批量插入数据可能会造成内存溢出,因此在插入前需要将数据列表按照一定的大小分为多个批次插入,本例中批次大小为1000。在插入完成后需要调用`flushStatements()`方法来刷新缓存,确保所有的语句都已经发送到数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值