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

公共字段自动填充-MyBatis-Plus

由于使用了MyBatis-Plus提供的方法操作数据库,所有无法直接使用AOP技术来在mapper方法执行前对公共字段赋值。

在 MyBatis-Plus 中,可以通过实现 MyBatis-Plus 提供的 MetaObjectHandler 接口来实现公共字段的自动填充,比如在插入或更新数据时,自动填充创建时间、更新时间等字段。

实现步骤:

  1. 创建一个类并实现 MetaObjectHandler 接口 该类用于实现自动填充的逻辑。

  2. 配置自动填充字段 在实体类中,通过注解来标识哪些字段需要自动填充。

1. 实现MetaObjectHandler 接口

创建实现 MetaObjectHandler 的类,该类用于在插入和更新时自动填充字段,比如创建时间、更新时间、创建用户、更新用户等。

// 标注为Spring组件,使其可以被Spring容器管理
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {// 插入时的自动填充策略@Overridepublic void insertFill(MetaObject metaObject) {// 字段自动填充的逻辑,可以判断当前字段是否为空然后进行填充// 使用strictInsertFill方法填充"createTime"字段,填充类型为LocalDateTime,填充值为当前时间this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 使用strictInsertFill方法填充"updateTime"字段,填充类型为LocalDateTime,填充值为当前时间this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 使用strictInsertFill方法填充"createUser"字段,填充类型为Long,填充值为当前用户IDthis.strictInsertFill(metaObject, "createUser", Long.class, BaseContext.getCurrentId());   // 使用strictInsertFill方法填充"updateUser"字段,填充类型为Long,填充值为当前用户IDthis.strictInsertFill(metaObject, "updateUser", Long.class, BaseContext.getCurrentId());   }// 更新时的自动填充策略@Overridepublic void updateFill(MetaObject metaObject) {// 使用strictUpdateFill方法填充"updateTime"字段,填充类型为LocalDateTime,填充值为当前时间this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 使用strictUpdateFill方法填充"updateUser"字段,填充类型为Long,填充值为当前用户IDthis.strictUpdateFill(metaObject, "updateUser", Long.class, BaseContext.getCurrentId());   }
}

解释:

  • insertFill:这个方法在插入数据时会被触发,用于自动填充createTimecreateUserupdateTime等字段。
  • updateFill:这个方法在更新数据时会被触发,用于自动填充updateTimeupdateUser字段。
  • BaseContext.getCurrentId():这是为了获取当前操作用户的ID,可以结合ThreadLocal进行存储与获取。

2. 在实体类中标记需要自动填充的字段

在实体类中的相关字段上使用@TableField注解来声明这些字段需要自动填充。

// 使用@Data注解自动生成getter、setter、toString、equals和hashCode方法
@Data
public class Employee {@TableField(fill = FieldFill.INSERT)  // 在插入时自动填充该字段private LocalDateTime createTime; // 创建时间字段,类型为LocalDateTime@TableField(fill = FieldFill.INSERT_UPDATE)  // 在插入和更新时自动填充该字段private LocalDateTime updateTime; // 更新时间字段,类型为LocalDateTime@TableField(fill = FieldFill.INSERT)  // 在插入时自动填充该字段private Long createUser; // 创建人ID字段,类型为Long@TableField(fill = FieldFill.INSERT_UPDATE)  // 在插入和更新时自动填充该字段private Long updateUser; // 更新人ID字段,类型为Long// 。。。其他属性略。。。
}

解释:

  • @TableField(fill = FieldFill.INSERT):表示在插入时自动填充该字段,例如 createTimecreateUser
  • @TableField(fill = FieldFill.INSERT_UPDATE):表示在插入和更新时都会自动填充该字段,例如 updateTimeupdateUser

3. 工作原理

  • 当你在执行 save 或者 update 操作时,MyBatis-Plus 会自动调用你实现的 MetaObjectHandler,检查并自动为指定字段填充默认值。
  • 使用 BaseContext.getCurrentId() 是为了获取当前操作的用户ID,配合 ThreadLocal,你可以在拦截器中设置用户ID信息,从而实现每个操作记录都是由特定的用户生成或更新的。

4. 总结

  1. 创建 MetaObjectHandler 实现类,负责自动填充字段逻辑。
  2. 在实体类中通过 @TableField 注解标记需要自动填充的字段。
  3. MyBatis-Plus 提供了 FieldFill.INSERTFieldFill.UPDATEFieldFill.INSERT_UPDATE 来区分字段在插入和更新时的自动填充需求。

http://www.mrgr.cn/news/54615.html

相关文章:

  • 基于Multisim8路彩灯循环控制电路设计与仿真
  • C++11标准 future异步线程库
  • 2024 最适合 Web 开发者的 9 款 Chrome 扩展
  • 《计算机视觉》—— 基于PyCharm中的dlib库实现人脸关键点定位
  • mysql查看和修改默认配置
  • 《计算机原理与系统结构》学习系列——处理器(上)
  • K近邻算法(KNN)的概述与实现
  • 【TDA】持续同调的矢量化方法
  • docker清理未使用的 Docker 资源
  • 【Linux】从 fork() 到 exec():理解 Linux 进程程序替换的魔法
  • 基于排名的股票预测的关系时态图卷积网络(RT-GCN)
  • 探索AI工具:从实用到创新的无限可能
  • 省心英语 3.9.9| 资源最全面的英语学习App
  • 实测:四大录音转文字助手哪家强?
  • Java中的日期类
  • LeetCode刷题日记之贪心算法(四)
  • 一款现代化、可定制的跨平台文件浏览器,高颜值高效率的的管理神器!(附私活源码)
  • 谷粒商城のRabbitMQ高级篇最终一致性解决方案。
  • Sourceforge下载镜像选择方法
  • Git Push(TODO)
  • Widget结构(一)
  • Mac M1 修改设置默认 PHP 版本
  • 晶体生长中位错的作用
  • 【你也能从零基础学会网站开发】浅谈一下SQL Server 2000中的日期和时间数据类型
  • Java 数组新手教程一口气讲完!(≧∀≦)ゞ
  • c++ 桶排序(看这一篇就够了)