当前位置: 首页 > news >正文

MyBatis-Plus MetaObjectHandler的几个坑(主要是id字段)

1.背景

主要是要实现一个id字段的自增长,不依赖数据库的能力(已避免后续换库的问题)。姑且使用redis作为表的id分配器,因此使用MyBatis-Plus MetaObjectHandler对每个insert的id进行分配。

2.实施过程

以下是实现过程
1.实现MetaObjectHandler,重写insertFill,设置id
2.Configuration中实例化MetaObjectHandler

public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {Long id = getIdFromRedis(); //redis取idthis.setFieldValByName("id", id, metaObject); //给id字段设置取得的主键值}@Overridepublic void updateFill(MetaObject metaObject) {//其他操作}
}
//Configuration中获取MetaObjectHandler 
@Configuration(proxyBeanMethods = false)
public class MybatisAutoConfiguration implements WebMvcConfigurer {@Beanpublic MybatisPlusMetaObjectHandler mybatisPlusMetaObjectHandler() {return new MybatisPlusMetaObjectHandler();}
}

3.使用mybatis-plus的mapper内的save或者saveBatch方法
*4.需要注意的是对应实体类需要加上insert fill注解

@Data
@TableName("TEST")
public class Test {@TableField(fill= FieldFill.INSERT)private Long id;private String fieldTest;
}

3.出现的问题

按上述方式实现后出现没有进入
insertFill的情况,
后来发现实体类只在id字段上加@TableField(fill= FieldFill.INSERT)是不会进insertFill的
因此尝试

@Data
@TableName("TEST")
public class Test {@TableField(fill= FieldFill.INSERT)private Long id;@TableField(fill= FieldFill.INSERT) private String fieldTest;
}

在另一个字段上加上@TableField(fill= FieldFill.INSERT)
然后成功进入了insertFill,也对id进行了赋值,但是最后生成的sql
居然没有id字段
居然没有id字段
居然没有id字段
是的,明明都已经走了对id的赋值,但生产的sql就是没有id字段赋值

4.最终解决

@Data
@TableName("TEST")
public class Test {@TableId(type = IdType.INPUT)@TableField(fill= FieldFill.INSERT)private Long id;@TableField(fill= FieldFill.INSERT) private String fieldTest;
}

最后是在id上加上@TableId(type = IdType.INPUT)使id字段的type是input,才成功实现了id从redis取这个功能

5.反思

然后我又尝试了以下代码

@Data
@TableName("TEST")
public class Test {@TableId(type = IdType.INPUT)@TableField(fill= FieldFill.INSERT)private Long id;//@TableField(fill= FieldFill.INSERT) private String fieldTest;
}

把其他字段上的@TableField(fill= FieldFill.INSERT) 去了 。。。然后又不会进入insertFill了
目测mybatis-plus源码的判断是,先判断是否存在非id字段需要走@TableField(fill= FieldFill.INSERT),才会进入insertFill,
然后判断设置填充的字段是否是id,且id有没有配置自定义Input

6.结论

本质上是id字段是mybatis-plus中的保留字段,一般需要配置@TableId,然后@TableId和@TableField(fill= FieldFill.INSERT)存在冲突。没有去看源码,但大概现象如此。

http://www.dtcms.com/a/343134.html

相关文章:

  • 《AI智脉速递》2025 年 8 月15 日 - 21 日
  • JetBrains 内的 GitHub Copilot Agent Mode + MCP:从配置到实战
  • vmware安装centos7
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第二章知识点问答(21题)
  • A股大盘数据-20250821 分析
  • 领域驱动中IUnitOfWork是干什么的
  • 【StarRocks】-- SQL CTE 语法
  • 机器学习中的集成算法与 k 均值聚类算法概述
  • 机器学习5
  • 解决办法:Chrome插件不能用,这些扩展程序不再受支持,因此已停用
  • 动态寻北仪如何在矿用掘进机中进行应用?
  • 用Vue2和Echarts画图的基本流程
  • AI升级社区便民服务:AI办事小程序高效办证+应急系统秒响应,告别跑腿愁住得更安心
  • K8s快速上手-微服务篇
  • AI资深 Java 研发专家系统解析Java 中常见的 Queue实现类
  • 【尝试】在macOS上安装cvat
  • unity实现点击rawimage,确定对应的世界坐标点
  • 记录前端菜鸟的日常——小程序内嵌H5页面自定义分享按钮
  • 环形子数组的最大和
  • Ubuntu24.04 交叉编译libuv库(已编译好的) 之undefined reference to `pthread_getname_np‘解决
  • VMware Workstation里的Ubuntu22.04找不到共享文件夹
  • Ubuntu Server 安装 gvm 管理 Go 语言开发环境
  • 代码随想录Day58:图论(拓扑排序精讲、最短路算法dijkstra朴素版精讲)
  • Android焦点窗口变化导致遥控键值监听失效问题分析
  • AI编程避坑指南:常见错误与解决策略
  • 年化42%,最大回撤18%,卡玛比率2.3的策略可查看参数 | 全A股市场构建技术方案
  • 数据库审计是什么?主要功能详解与厂商解析
  • 第7章 区分鸟和飞机:从图像学习
  • 【网络运维】初见Shell:Shell 变量基础知识
  • Vue图解!!!Vue的生命周期管理【7】