确认
- [x] 我使用的版本是最新版, 并且使用插件确认过项目里无依赖版本冲突
- [x] 我已经在 issue 中搜索过, 确认问题没有被提出过
- [x] 我已经修改标题, 将标题中的 描述 替换为遇到的问题(不得删除 描述 前面的部分)
当前程序版本
latest-version
问题描述
在使用 saveOrUpdateBatch 时,内部实现调用了:
sqlSession.selectList(SqlHelper.getSqlStatement(mapperClass, SqlMethod.SELECT_BY_ID), entity);
这里把 整个实体对象 作为参数传入了 SELECT_BY_ID,而不是仅仅传主键。
如果用户实现了自定义的 ParameterHandler(例如插入/更新时对字段加密)、ResultSetHandler(查询时解密),在执行 SELECT_BY_ID 这一步时,实体参数也会进入加密逻辑。 这样在真正执行 INSERT/UPDATE 时会再次加密,导致数据被 二次加密。
SELECT_BY_ID 查询只需要主键值,不应该传整个实体对象。sqlSession.selectList(SqlHelper.getSqlStatement(mapperClass, SqlMethod.SELECT_BY_ID), idVal);
详细堆栈日志
复现步骤
自定义 ParameterHandler:在 INSERT/UPDATE 时对字段做加密。
调用 saveOrUpdateBatch。
发现数据被加密了两次:一次发生在 SELECT_BY_ID,一次发生在 INSERT/UPDATE。
环境信息:
MyBatis-Plus 版本: [latest-version]
数据库: [例如 MySQL 8.0]
JDK: [例如 JDK 17]
当前行为会对带有加密、审计等逻辑的拦截器造成严重影响。
建议优化实现,仅在 SELECT_BY_ID 传入主键值,而不是整个实体对象。