• service类通过 SqlHelper.saveOrUpdateBatch 实现通过自定义的 唯一索引 进行 批量保存更新


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import org.apache.ibatis.binding.MapperMethod;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cn.com.redboard.modules.mi.base.entity.MesProdMiProc;
import cn.com.redboard.modules.mi.base.mapper.MesProdMiProcMapper;
import cn.com.redboard.modules.mi.base.service.IMesProdMiProcService;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
* @Description: MI工艺流程Service
* @Author: wqc
* @Date: 2022-03-01
* @Version: V1.0
*/
@Service
public class MesProdMiProcServiceImpl extends ServiceImpl<MesProdMiProcMapper, MesProdMiProc> implements IMesProdMiProcService {

@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void sync(List<MesProdMiProc> prodMiProcList) {

// 每2000条语句,进行一次sqlSession.flushStatements()
SqlHelper.saveOrUpdateBatch(this.entityClass, this.mapperClass, this.log, prodMiProcList, 2000, (sqlSession, entity) -> {
MapperMethod.ParamMap param = new MapperMethod.ParamMap();

Object erpProcessId = ReflectionKit.getFieldValue(entity, ${otherUniqueIdx});
LambdaQueryWrapper<MesProdMiProc> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MesProdMiProc::getErpProcessId, erpProcessId);
// 自定义查询条件
param.put("ew", queryWrapper);

// 判断记录是否存在,存在则更新,否则插入
return StringUtils.checkValNull(erpProcessId) || CollectionUtils.isEmpty(sqlSession.selectList(this.getSqlStatement(SqlMethod.SELECT_LIST), param));
}, (sqlSession, entity) -> {
MapperMethod.ParamMap param = new MapperMethod.ParamMap();
// 需要更新的当前记录实体
param.put("et", entity);

LambdaQueryWrapper<MesProdMiProc> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MesProdMiProc::getErpProcessId, ReflectionKit.getFieldValue(entity, ${otherUniqueIdx}));
            // 自定义查询条件
            param.put("ew", queryWrapper);

sqlSession.update(this.getSqlStatement(SqlMethod.UPDATE), param);
});

}

}

  • SqlHelper.saveOrUpdateBatch具体源码


  • SqlHelper.executeBatch具体源码


 

mybatis-plus 3.4.3.1 进行批量 saveOrUpdate的更多相关文章

  1. MyBatis魔法堂:各数据库的批量Update操作

    一.前言   MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. ...

  2. mybatis 框架 的应用之二(批量添加、实现分页查询)

    lf-driver=com.mysql.jdbc.Driver lf-url=jdbc:mysql://localhost:3306/test lf-user=LF lf-password=LF &l ...

  3. 【MyBatis】从一千万记录中批量删除八百万条,耗时4m7s

    批量删除主要借助了MySql的limit函数,其次用了in删除. 代码如下: package com.hy.action; import java.io.Reader; import java.uti ...

  4. coding++:mybatis update foreach (SQL循环)批量更新

    今天要做批量更新的业务,采用 mybaits 的 foreach 动态语句,遇到一些问题做下记录. 参考示例(1): <update id="" parameterType= ...

  5. mybatis批量保存的两种方式(高效插入)

    知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...

  6. mybatis 批量update报语法错误解决方法

    1.为什么会报语法错误 原因:在 *.xml文件内使用了循环,在mybatis中默认是不允许使用批量修改. <update id="setMaxMin" parameterT ...

  7. Mybatis中进行批量更新(updateBatch)

    更新多条数据,每条数据都不一样 背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新.(2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作 ...

  8. myBatis,Spring,SpringMVC三大框架ssm整合模板

    整合步骤 创建web工程 导入整合所需的所有jar包 编写各层需要的配置文件 1) mybatis的全局配置文件 <configuration>    <!-- 批量别名的设置 -- ...

  9. 开源顶级持久层框架——mybatis(ibatis)——day01

    mybatis-day01     1.对原生态jdbc程序中的问题总结         1.1环境             java环境:jdk             eclipse:indigo ...

  10. SpringBoot集成MyBatis的分页插件 PageHelper

    首先说说MyBatis框架的PageHelper插件吧,它是一个非常好用的分页插件,通常我们的项目中如果集成了MyBatis的话,几乎都会用到它,因为分页的业务逻辑说复杂也不复杂,但是有插件我们何乐而 ...

随机推荐

  1. vi中将小写转换成大写字母

    VI阅读模式下连续按gUW可以将小写转换成大写

  2. Codeforces Round #843 (Div. 2) C【思维】

    https://codeforces.com/contest/1775/problem/C 题意 题意是说,给你n和x,你要求出最小的满足要求的m,使得 \(n\)&\((n+1)\)& ...

  3. 4-发票校验-不可能为条目1000 DIF确立帐户-消息号 M8147

    SPRO-->物料管理-->评估和科目设置-->科目确定-->无向导的科目确定-->配置自动记帐(OBYC)

  4. 【python基础教程】-10.开箱即用(模块的工作原理,获悉模块的功能以及常用模块)

    资料来源 (1) Python基础教程第三版 1.模块的工作原理 1.1 简单的模块及使用 1.1.1 模块的本质 (1) 模块就是程序,任何python程序都可以作为模块导入; 1.1.2 简单的模 ...

  5. 生成虚拟mac地址通过dhcp获取ip,耗尽dhco地址池

    平台:kali 软件:dhcpstarv 命令 dhcpstarv  -i 网卡名称 -e 本机IP 查看dhcp服务器已经分发的地址 cat /tmp/dhcp.leases

  6. Python 数据结构及语法

    Python 数据结构及语法 Python 数据结构及其接口方法 列表 lst = [] lst.sort() # 排序列表 lst.reverse() # 反转列表 lst.append() # 表 ...

  7. gitlab上传代码,菜鸟教学

    1.首先需要在gitlab上新建项目 2.编辑项目名称 3.在本地电脑上新建一个空的文件夹(或者是一个固定统一的文件夹),方便后续找到,这里会将gitlab的项目拉到这个文件内. 点击进入这个文件夹, ...

  8. Python3 文件处理相关脚本

    对文件相关处理是脚本中最常见的,下面列举几种实用的案例: 批量删除: (1)删除指定目录,指定后缀文件 例:删除目录J:/start下的 .log与.tmp结尾文件 def del_files(pat ...

  9. 2357. 使数组中所有元素都等于零 (Easy)

    问题描述 2357. 使数组中所有元素都等于零 (Easy) 给你一个非负整数数组 nums .在一步操作中,你必须: 选出一个正整数 x , x 需要小于或等于 nums 中 最小 的 非零 元素. ...

  10. 【剑指Offer】【树】二叉树的镜像

    题目:操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 1 ...