Mybatis-plus 公共字段自动填充
Mybatis-Plus官方文档:
1. 在实体类的属性上添加 @TableField
注解,指定自动填充的策略;
填充策略:
/** * 创建人 */ @TableField(fill = FieldFill.INSERT) // 插入时填充字段 private Long createUser; /** * 修改人 */ @TableField(fill = FieldFill.INSERT_UPDATE) // 插入和修改时填充字段 private Long updateUser;
2. 按照框架要求编写 元数据对象处理器
, 在此类中统一为公共字段
赋值,此类需要实现 MetaObjectHandler
接口。
/** * 元数据对象处理器,实现 MetaObjectHandler接口 */ @Component @Slf4j public class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入操作,自动填充 * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { // 获得当前线程的 request,得到 session,获取session中的 employeeId。RequestAttributes.SCOPE_SESSION:获取范围为session。 // 注意,由于线程问题,不能写在该方法外 Long employeeId = (Long) RequestContextHolder .currentRequestAttributes() .getAttribute("employeeId", RequestAttributes.SCOPE_SESSION); //将当前时间赋值给“createTime”属性,这样当插入或修改数据时,createTime是有值的,而不是null metaObject.setValue("createTime", LocalDateTime.now()); metaObject.setValue("updateTime", LocalDateTime.now()); //将“创建人”赋值给“createUser”属性,当执行插入操作时自动执行 metaObject.setValue("createUser", employeeId); //当执行插入操作或更新操作时自动执行 metaObject.setValue("updateUser", employeeId); } /** * 更新操作,自动填充 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { // 获得当前线程的 request,得到 session,获取session中的 employeeId。RequestAttributes.SCOPE_SESSION:获取范围为session。 Long employeeId = (Long) RequestContextHolder .currentRequestAttributes() .getAttribute("employeeId", RequestAttributes.SCOPE_SESSION); metaObject.setValue("updateTime", LocalDateTime.now()); metaObject.setValue("updateUser", employeeId); } }
下面是官方文档的操作:
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用) // 或者 this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐) // 或者 this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug) } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐) // 或者 this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐) // 或者 this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug) } }
这样的话,当createUser执行插入操作 或 updateUser执行插入和更新操作时,会按照 MetaObjectHandler 中的处理方式进行自动填充。