赞
踩
MetaObjectHandler用在数据库持久化之前,用来对实体对象的公共字段进行统一赋值操作。例如常用来赋值创建时间、创建人、更新时间、更新人等字段
注意:本文使用的是3.0.7.1
版本的mybatis-plus(旧项目原因),相对于现在的[v3.5.3] 2022.12.29
版本较为老旧,对比官方文档使用
值填充失效的情况(有三种):
①被填充的entity
对象的字段值不为null;如,要给creator填充,entity
为{creator: ‘小明’},则失效;
②要填充到entity
对象的值为null;如,要给creator填充,但填充的creatorFill(非实体)值为null,则不失效
③在update(T t,Wrapper updateWrapper)
方法中t为null
时,自动填充也会失效值填充生效的情况: 除了值不填充之外的所有情况(手动狗头)
第一步:自定义实现元对象处理器MetaObjectHandler
接口,重写插入和更新方法insertFill
和updateFill
:
@Component public 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; /** 也可只是更新时填充 @TableField(fill = FieldFill.UPDATE) private Date updateTime; */ }
public enum FieldFill { /** * 默认不处理 */ DEFAULT, /** * 插入填充字段 */ INSERT, /** * 更新填充字段 */ UPDATE, /** * 插入和更新填充字段 */ INSERT_UPDATE }
失效情况:不指定更新对象时无效
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 @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) } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。