Mybatis-Plus使用saveBatch方法不回显ID的问题

Published on
114 7~10 min

背景

公司的动态数据源加密组件升级到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

结尾

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