惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
T
The Blog of Author Tim Ferriss
C
Check Point Blog
博客园_首页
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
L
LangChain Blog
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
Vercel News
Vercel News
博客园 - Franky
V
V2EX
IT之家
IT之家
U
Unit 42
N
Netflix TechBlog - Medium
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
博客园 - 叶小钗
H
Help Net Security
V
Visual Studio Blog
GbyAI
GbyAI

kissthisrain

悲,OpenCodeGo套餐大砍 Token 用量小组件:适配 DeepSeek Harness 七月杂记 我是如何入住 InStreet 的:一个 AI Agent 的社交初体验 和OpenClaw聊着天,文章就发出去了 OpenClaw使用感受 Google Gemini体验 记笔记本开机不能自动联网的问题 关于我换掉2060S这件事:一些不成熟的显卡选购碎碎念 国庆后的第一个周末 记一次服务器负载过高的问题 职场搬迁新办公地 我的小狗 解决使用OpenVPN导致网络卡顿的问题 DICOM医学影像匿名化导致服务重启的问题 本地运行halo碰到的问题 MongoDB语句(待补充) Java项目启动时间过长的问题 MySQL常用语句记录 windows常用命令记录 私有CI/CD平台搭建(一)Drone安装及部署 Alibaba Cloud Linux release 3安装Docker
Mybatis-Plus使用saveBatch方法不回显ID的问题
kissthisrain · 2024-10-14 · via kissthisrain

背景

公司的动态数据源加密组件升级到1.2.2.RELEASE后,发现Mybatis-Plus的saveBatch方法不能回显id到DO对象中

原因分析

首先表id的生成策略为数据库自增,在这个基础上,debug代码发现,原有的id回显赋值逻辑如下:

  • Jdbc3KeyGenerator下的processBatch中为id回显赋值对应代码

image2024-1-23_14-9-14.png

  • (关键)上面stmt.getGeneratedKeys()实际获取的ResultSet为shardingsphere提供的GeneratedKeysResultSet,此时statements为空导致GeneratedKeysResultSet内部的values为空

image2024-1-23_14-15-18.png

  • 在Jdbc3KeyGenerator类下有如下实现,其中的assign方法为具体的赋值逻辑,此时根据GeneratedKeysResultSet的next为false导致无法进入assign方法

image2024-1-23_14-3-49.png

总结:动态数据源加密组件升级,间接的升级了shardingsphere-jdbc-core-spring-boot-starter的版本到5.1.2,由于该版本重写了statement导致原有的id回显逻辑没有执行

解决方法

由于shardingsphere官方已经表明暂时不会支持此种场景的id回写:https://github.com/apache/shardingsphere/issues/9592

所以只能采用其他方式兼容,目前的解决方式为:

1.去掉DO中关于@tableId的type

2.实现ibatis的Interceptor,拦截执行器为MybatisBatchExecutor的insert方法,在执行前手动赋值雪花算法ID

结尾

版本升级无小事,谨慎谨慎再谨慎呀