mybatisplus自动填充
第一步
首先我们要加上注解填充字段 @TableField(… fill = FieldFill.INSERT)
@Data
@TableName(value = "user")
public class User implements Serializable {
//fill字段就是要说明在哪里在什么情况下实现自动填充
@TableField(value = "username",fill = FieldFill.INSERT_UPDATE)
private String username;
@TableField(value = "password", fill = FieldFill.INSERT_UPDATE)
private String password;
}
这里面的fieldFill就是选择你要在上面情况下进行自动填充,我们可以点进去看一下。
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
第二步
自定义实现类 MyMetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//这个方法就是插入的时候执行自动填充的方法
@Override
//
public void insertFill(MetaObject metaObject) {
if (metaObject.hasSetter("createTime"))
{
this.strictInsertFill(metaObject, "createTime", Date.class,LocalDateTime.now()));
}
}
//这个方法就是更新时执行自动填充的方法
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
其中的metaObject就是元对象,你可以通过metaObject.hasSetter()判断有没有这个字段,然后再去执行方法
第三步,注意事项
下面我们来看看官方的注意事项:
- 填充原理是直接给
entity
的属性设置值!!! - 注解则是指定该属性在对应情况下必有值,如果无值则入库会是
null
MetaObjectHandler
提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null
则不填充- 字段必须声明
TableField
注解,属性fill
选择对应策略,该声明告知Mybatis-Plus
需要预留注入SQL
字段 - 填充处理器
MyMetaObjectHandler
在 Spring Boot 中需要声明@Component
或@Bean
注入 - 要想根据注解
FieldFill.xxx
和字段名
以及字段类型
来区分必须使用父类的strictInsertFill
或者strictUpdateFill
方法 - 不需要根据任何来区分可以使用父类的
fillStrategy
方法 - update(T t,Wrapper updateWrapper)时t不能为空,否则自动填充失效