Mybatis-Plus使用saveBatch方法不回显ID的问题
背景
公司的动态数据源加密组件升级到1.2.2.RELEASE后,发现Mybatis-Plus的saveBatch方法不能回显id到DO对象中
原因分析
首先表id的生成策略为数据库自增,在这个基础上,debug代码发现,原有的id回显赋值逻辑如下:
Jdbc3KeyGenerator下的processBatch中为id回显赋值对应代码
(关键)上面stmt.getGeneratedKeys()实际获取的ResultSet为shardingsphere提供的GeneratedKeysResultSet,此时statements为空导致GeneratedKeysResultSet内部的values为空
在Jdbc3KeyGenerator类下有如下实现,其中的assign方法为具体的赋值逻辑,此时根据GeneratedKeysResultSet的next为false导致无法进入assign方法
总结:动态数据源加密组件升级,间接的升级了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
结尾
版本升级无小事,谨慎谨慎再谨慎呀