【Mybatis-Plus 扩展功能】自动填充功能接口 MetaObjectHandler
前言
MetaObjectHandler用在数据库持久化之前,用来对实体对象的公共字段进行统一赋值操作。例如常用来赋值创建时间、创建人、更新时间、更新人等字段
注意:本文使用的是3.0.7.1
版本的mybatis-plus(旧项目原因),相对于现在的[v3.5.3] 2022.12.29
版本较为老旧,对比官方文档使用
一、MetaObjectHandler 接口
值填充失效的情况(有三种):
①被填充的entity
对象的字段值不为null;如,要给creator填充,entity
为{creator: ‘小明’},则失效;
②要填充到entity
对象的值为null;如,要给creator填充,但填充的creatorFill(非实体)值为null,则不失效
③在update(T t,Wrapper updateWrapper)
方法中t为null
时,自动填充也会失效值填充生效的情况: 除了值不填充之外的所有情况(手动狗头)
二、使用
第一步:自定义实现元对象处理器MetaObjectHandler
接口,重写插入和更新方法insertFill
和updateFill
:
@Componentpublic class DateFillHandler implements MetaObjectHandler { @Autowired @Lazy //(生产过程中这里出现了循环依赖报错,然后加了延迟加载解决,没这个问题的可以跳过) private UserService userService; @Override public void insertFill(MetaObject metaObject) { User userInfo = userService.getCurrentUser(); if (userInfo.getUsername() != null){ // 对新增时使用了createBy、updateBy标签的字段赋予用户名(与字段同名最好,不用再配) // createTime和updateTime同上 this.setFieldValByName("createBy",userInfo.getUsername(),metaObject); this.setFieldValByName("updateBy",userInfo.getUsername(),metaObject); } this.setFieldValByName("createTime", new Timestamp(System.currentTimeMillis()), metaObject); this.setFieldValByName("updateTime", new Timestamp(System.currentTimeMillis()), metaObject); } @Override public void updateFill(MetaObject metaObject) { User userInfo = userService.getCurrentUser(); // 对新增时使用了updateBy、updateTime标签的字段赋予用户名 if (userInfo.getUsername() != null){ this.setFieldValByName("updateBy",userInfo.getUsername(),metaObject); } this.setFieldValByName("updateTime", new Timestamp(System.currentTimeMillis()), metaObject); }}
第二步:使用@TableField
注解,对新增使用FieldFill.INSERT
,对更新使用FieldFill.UPDATE
,插入和更新都赋值使用FieldFill.INSERT_UPDATE
public class User implements Serializable { private static final long serialVersionUID = 1L; private String id; @TableField(fill = FieldFill.INSERT) private String createBy; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private String updateBy; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
三、枚举说明
public enum FieldFill { DEFAULT, INSERT, UPDATE, INSERT_UPDATE}
四、update(T t,Wrapper updateWrapper)失效举例
失效情况:不指定更新对象时无效
LambdaUpdateWrapper<CarInformation> updateWrapper = new LambdaUpdateWrapper();//此处省略条件和set值代码userXxxMapper.update(null, updateWrapper)
有效情况:指定更新对象之后填充值有效
LambdaUpdateWrapper<UserXxx> updateWrapper = new LambdaUpdateWrapper();UserXxx userXxx = new UserXxx("小明");//此处省略条件和set值代码userXxxMapper.update(userXxx, updateWrapper)
五、官方示例
新版本使用strictInsertFill()
,strictUpdateFill
方法。还有fillStrategy
方法,根据自己的版本进行选择
@Slf4j@Componentpublic 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) }}
来源地址:https://blog.csdn.net/qq_44397508/article/details/129371917
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341