确认

  • [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 传入主键值,而不是整个实体对象。