当前位置: 首页 > news >正文

重新 mybatis plus 的 撒着OrUpdate 方法,实现根据自定义字段插入或者修改

我希望数据能根据name和content作为唯一索引,如果 数据库中的数据, name和content相同,就更新记录,如果不同,就插入记录。

废话不多说,直接上代码。

@Override@Transactional(rollbackFor = Exception.class)public boolean saveOrUpdateBatch(Collection<FulfillmentItem> entityList) {return SqlHelper.saveOrUpdateBatch(this.getEntityClass(),this.currentMapperClass(),super.log,entityList,DEFAULT_BATCH_SIZE,(sqlSession, entity) -> {Wrapper<FulfillmentItem> queryWrapper = Wrappers.<FulfillmentItem>lambdaQuery().eq(FulfillmentItem::getName, entity.getName()).eq(FulfillmentItem::getContent, entity.getContent());Map<String, Object> map = new HashMap<>();map.put(Constants.WRAPPER, queryWrapper);return CollectionUtils.isEmpty(sqlSession.selectList(this.getSqlStatement(SqlMethod.SELECT_LIST), map));},(sqlSession, entity) -> {Wrapper<FulfillmentItem> lambdaUpdateWrapper = Wrappers.lambdaUpdate(FulfillmentItem.class).eq(FulfillmentItem::getName, entity.getName()).eq(FulfillmentItem::getContent, entity.getContent());Map<String, Object> map = new HashMap<>();map.put(Constants.ENTITY, entity);map.put(Constants.WRAPPER, lambdaUpdateWrapper);sqlSession.update(getSqlStatement(SqlMethod.UPDATE), map);});}

注意点:
saveOrUpdateBatch 本质是先查后改,高并发业务请谨慎取用。

mybatis 旧版本略有不同,没有 this.getEntityClass() 方法。
原因是旧版本中,entityClass 属性是 protectd 类型,可以直接用,
springboot 3 后的版本,改成了 private 类型。

源码:

    private Class<T> entityClass; // 旧版本是 protected类型public Class<T> getEntityClass() {if (this.entityClass == null) {this.entityClass = GenericTypeUtils.resolveTypeArguments(this.getMapperClass(), BaseMapper.class)[0];}

当然,这里也可以根据 name 和 content 作为唯一索引,用 MySQL 的 ON DUPLICATE KEY UPDATE 来做判断。

但是由于我content是text类型,无法用作索引列。

如果高并发下,非要用 DUPLICATE KEY UPDATE,可以加一列:content_hash.
通过存储 content 内容的哈希值,来做唯一索引,也能解决这个问题。

http://www.dtcms.com/a/321860.html

相关文章:

  • P1044 [NOIP 2003 普及组] 栈
  • B4263 [GESP202503 四级] 荒地开垦 题解
  • 【工作笔记】Docker Desktop一直转圈加载不出来然后报错
  • 提升LLM服务效率的秘密武器——vLLM!
  • Docker 安装 Redis
  • 机柜中不同类型板卡的操作系统配置情况一览
  • 解决苍穹外卖项目中 MyBatis - Plus 版本冲突问题
  • 【Linux运维】深入理解Cookie与Session机制:安全性与性能的平衡艺术
  • SAP接口日志查询
  • 多级缓存架构:新品咖啡上线引发的数据库压力风暴与高并发实战化解方案
  • 数据返回后需要刷新才会展示的解决方法
  • Vue3 组合式API
  • 飞算JavaAI深度解析:专为Java生态而生的智能引擎
  • 快速了解svm算法
  • Java 执行 SFTP 文件上传和下载
  • ​​《深入浅出K-means算法:从原理到实战全解析》​预告(提纲)
  • 【Spring Boot 快速入门】八、登录认证(一)基础登录与认证校验
  • 阿里巴巴高级Java工程师面试算法真题解析:LRU Cache实现
  • 详解 RT-Thread 串口一配置、设备查找与打印功能(rt_kprintf)的绑定机制
  • 完整设计 之 运行时九宫格 (太乙九宫 播放器)
  • AI 记忆管理系统:工程实现设计方案
  • 【感知机】感知机(perceptron)学习算法知识点汇总
  • 代码随想录算法训练营第三十八天、三十九天|动态规划part11、12
  • 【LLM开发学习】
  • 小程序实现二维码图片Buffer下载
  • C#结合HALCON去除ROI选中效果的实现方法
  • django uwsgi启动报错failed to get the Python codec of the filesystem encoding
  • 如何永久删除三星手机中的照片?
  • Nestjs框架: 接口安全与响应脱敏实践 --- 从拦截器到自定义序列化装饰器
  • Charles中文版抓包工具功能解析,提升API调试与网络性能优化