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

news/2024/10/20 16:43:01/

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

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

实现步骤:

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

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

1. 实现MetaObjectHandler 接口

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

java">// 标注为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注解来声明这些字段需要自动填充

java">// 使用@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.ppmy.cn/news/1540568.html

相关文章

2024年【汽车驾驶员(技师)】考试题库及汽车驾驶员(技师)试题及解析

随着汽车行业的快速发展,对汽车驾驶员的专业技能要求也越来越高。为了确保每一位驾驶员都能具备扎实的专业技能和安全生产知识,2024年的汽车驾驶员(技师)考试题库进行了全面更新。安全生产模拟考试一点通作为专业的考试辅导平台&a…

②PROFINET转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 PROFINET 转 Modbus TCP (接上一章) 配置使用 与 PROFINET 主站进行组态说明 这里介绍与西门子 PLC 的…

docker 基础镜像里 scratch 和alpine,ubuntu centos详细对比(镜像优化)

1. scratch 特点 极简:scratch 是一个空的镜像,没有任何操作系统或文件系统。 体积:scratch 镜像的大小几乎为零,是最小的镜像。 灵活性:完全由用户自定义,没有任何预装的工具或库。 依赖管理&#xff1…

【Linux系统编程】第三十三弹---深入探索进程间通信:原理、方式、及管道技术详解

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程为什么要通信 2、进程如何通信 3、进程间常见的通信方式 4、管道 4.1、什么是管道 4.2、匿名管道 4.2.1、定义 …

两个数列问题

# 问题描述 给定长度分别为 n 和 m 的两个数列a[n]、b[m],和一个整数k。求|(a[i] - b[j])^2 - k^2|的最小值。 ## 输入格式 第一行有 2 个整数 n、m、k,分别表示数列 a、b 的长度,以及公式中的整数 k。 第二行有 n 个整数,表示…

【Flutter】Dart:库

在 Dart 中,库(Library)是组织和重用代码的基本方式。通过库,我们可以将代码分割成模块化的部分,方便管理和共享,同时避免命名冲突。Dart 提供了大量内置库,用于支持常见的功能,比如…

pandas-使用技巧

pandas-使用技巧 简单技巧 仅个人笔记使用,感谢点赞关注 简单技巧 pd.to_dict():Dataframe格式数据转字典数据pd.dropna():去nan值& | ~:pd逻辑运算符pd.isnan():判断是否为nan值pd.concat:多个pd拼接…

CR6609 刷机

如果要刷openwrt,必须用pb-boot,如果用breed,会进不了系统。 刷了breed的话,可以在breed改刷pb-boot,在bootloader那里选择pb-boot的固件上传更新即可 而用pb-boot的话,也可以很方便的刷回breed&#xff…