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

告别手动set时间!MyBatis-Plus的MetaObjectHandler配置,90%的人可能都漏了这一步

告别手动set时间!MyBatis-Plus的MetaObjectHandler配置,90%的人可能都漏了这一步

在Spring Boot项目中,MyBatis-Plus的自动填充功能是提升开发效率的利器,但很多开发者在配置MetaObjectHandler时,往往会遇到自动填充不生效的问题。本文将带你深入排查这一常见问题,并提供一个完整的解决方案。

1. 自动填充功能的基本配置

首先,我们需要了解MyBatis-Plus自动填充的基本配置流程。以下是一个典型的配置步骤:

  1. 添加依赖:确保项目中引入了MyBatis-Plus的starter依赖。
  2. 实体类注解:在需要自动填充的字段上添加@TableField注解。
  3. 实现MetaObjectHandler:创建一个类实现MetaObjectHandler接口,并添加@Component注解。
@Data public class User { @TableId(type = IdType.AUTO) private Long id; private String name; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } }

2. 常见问题排查

当自动填充不生效时,可以按照以下步骤进行排查:

2.1 基础检查

  • 确认@Component注解是否被正确扫描
  • 检查字段类型是否匹配(如LocalDateTime与Date)
  • 验证@TableField注解的fill属性是否正确

2.2 进阶排查

如果基础检查都通过,但自动填充仍然不生效,可能是以下原因:

  1. 多数据源配置冲突:当项目中使用多数据源时,自定义的SqlSessionFactory可能会覆盖默认配置。
  2. 特定版本问题:某些MyBatis-Plus版本可能存在已知的自动填充问题。
  3. 全局配置缺失:在特定项目结构中,需要显式配置GlobalConfig

3. 完整解决方案

对于大多数项目,特别是使用了多数据源或特定starter的项目,需要以下完整配置:

@Configuration public class MybatisPlusConfig { @Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); return globalConfig; } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }

对于更复杂的多数据源场景,需要为每个数据源单独配置:

@Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); factoryBean.setGlobalConfig(globalConfig); return factoryBean.getObject(); }

4. 最佳实践与性能优化

为了确保自动填充功能的高效运行,建议遵循以下最佳实践:

  1. 使用strict模式:在MetaObjectHandler实现中使用strictInsertFillstrictUpdateFill方法,可以避免字段类型不匹配的问题。
  2. 避免频繁创建对象:对于常用的填充值(如当前时间),可以缓存而不是每次都创建新对象。
  3. 日志记录:在MetaObjectHandler中添加适当的日志,方便调试和问题排查。
@Component @Slf4j public class OptimizedMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.debug("开始执行插入自动填充"); LocalDateTime now = LocalDateTime.now(); this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now); this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now); } @Override public void updateFill(MetaObject metaObject) { log.debug("开始执行更新自动填充"); this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } }

在实际项目中,我曾遇到一个典型问题:在多模块项目中,由于包扫描范围设置不当,导致MetaObjectHandler未被正确加载。通过显式配置GlobalConfig并检查包扫描范围,最终解决了这个问题。

http://www.jsqmd.com/news/678687/

相关文章:

  • 成都废旧家具拆装清运品牌排行:成都日式搬家,成都旧家具清运,成都旧家电清运,成都旧床垫清运,优选推荐! - 优质品牌商家
  • 如何用Python工具解决B站视频的本地化保存难题
  • 从C语言到Verilog:一个软件工程师的FPGA入门踩坑实录(附HDLBits刷题笔记)
  • 重庆会展公司那个好 - 速递信息
  • 收藏|2026版大模型学习路线图,小白程序员从零到落地不迷路
  • 从‘找不同’到‘分好类’:图解监督对比学习(SCL)如何让模型学得更‘明白’
  • RAG:检索器质量评估指标
  • Flutter 三方库 pull_to_refresh 的鸿蒙化适配指南
  • 终极指南:使用WorkshopDL免费下载Steam创意工坊模组的完整教程
  • 流量图6 - 小镇
  • 宝宝辅食品牌推荐:6月龄+辅食选购清单,四大品牌一键匹配 - 速递信息
  • 命运2启动报错msvcp140.dll终极解决方法(2026版)
  • 从实战出发:用RectTransform的Pivot和Anchor,5分钟搞定一个自适应弹窗UI
  • 如何快速为Word安装APA第7版参考文献格式:3分钟搞定学术排版难题
  • 2026具身智能数据行业研究白皮书
  • 2026门式起重机升级改造厂家:防爆与冶金专用机型技术突破与应用全解析 - 速递信息
  • AScript函数体系详解
  • 新手避坑指南:用PCF85063 RTC芯片搞定项目时间,从BCD码转换到寄存器配置详解
  • 2026年3月口碑好的水处理源头厂家哪家有实力,优选实力品牌 - 品牌推荐师
  • 终极iOS 15-16 iCloud绕过方案:如何彻底解除Apple账户锁?
  • 拆解电赛“交流电子负载”:除了拓扑,我们更该关注TVA1421采样与LM5164电源这些细节
  • 2026养生馆加盟品牌综合维度排行与创业适配指南 - 速递信息
  • 手把手教你改造draw.io:实现“无弹窗”创建与“静默”保存的流畅体验
  • 《深度学习入门》聚焦于自然语言处理领域
  • 2026年退休专列旅游品牌排行:新疆游专列在哪儿报名/旅游攻略/火车专列旅游/火车旅行/熊猫专列什邡号/选择指南 - 优质品牌商家
  • 告别手动造数!用SystemVerilog的$fscanf和$sscanf自动解析测试激励
  • 给Go应用做一次‘全身体检’:手把手教你用trace分析GC、调度与协程阻塞
  • 【2026年版|必收藏】程序员/小白入门大模型指南:转行不踩坑,选对方向少走1年弯路
  • Java 25虚拟线程在Spring Boot 3.4中落地全链路实践(从ThreadLocal兼容到Project Loom监控闭环)
  • 2026养生馆加盟品牌排行:5大头部品牌实力解析 - 速递信息