mybatisPlus之自动填充工具MetaObjectHandler使用demo及注意点

一. 使用场景
MetaObjectHandler是元对象字段填充控制器抽象类,实现公共字段自动写入。

比如通常,我们在建表时,会设置几个公共字段:创建人(creator)、更新人(uptater)、创建时间(create_time)、更新时间(update_time)。

每次将实体对象新增入库时,都要设置创建人和创建时间;每次更新实体对象时,都要设置更新人和更新时间;如果这是都放在业务代码中,很是繁琐,那么可不可以统一配置,自动帮我们添加这些属性呢?答案就是使用MetaObjectHandler。

二. 使用姿势
官方说明:https://mp.baomidou.com/guide/auto-fill-metainfo.html
注意:不同版本api略有不同,但是步骤是一样的,接口也是一样的,本文是3.1.0 。

步骤如下:

1.实现MetaObjectHandler接口
MetaObjectHandler接口有两个接口方法,需要我们自己去实现它:

/**
* 插入元对象字段填充(用于插入时对公共字段的填充)
*
* @param metaObject 元对象
*/
void insertFill(MetaObject metaObject);

/**
 * 更新元对象字段填充(用于更新时对公共字段的填充)
 *
 * @param metaObject 元对象
 */
void updateFill(MetaObject metaObject);

1
2
3
4
5
6
7
8
9
10
11
12
13
自定义实现类MyMetaObjectHandler如下:

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

@Override
public void insertFill(MetaObject metaObject) {
    log.info("start insert fill ....");
      this.setFieldValByName("creator", bucUserBo.getEmpId(), metaObject);
     this.setFieldValByName("create_time", new Date(), metaObject);
}

@Override
public void updateFill(MetaObject metaObject) {
    log.info("start update fill ....");
    this.setFieldValByName("updater", "", metaObject);
    this.setFieldValByName("update_time", new Date(), metaObject);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
思路就是实现两个接口方法,一个更新,一个插入,然后对一些公共属性进行赋值操作;
对于更新人和创建人这两个属性,一般从Threadlocal中取值。

  1. 实体类上添加注解
    除了上面实现两个接口方法,还需要在对应实体的属性上添加注解,这样mybatisplus才会取进行赋值处理。

/**

  • 创建时间
    */
    @TableField(value = “create_time”,fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
    private Date createTime;

/**

  • 创建者工号
    */
    @TableField(value = “creator”,fill = FieldFill.INSERT)
    private String creator;

/**

  • 更新时间
    */
    @TableField(value = “update_time”,fill = FieldFill.INSERT_UPDATE)
    @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
    private Date updateTime;

/**

  • 更新者工号
    */
    @TableField(value = “updater”,fill = FieldFill.INSERT_UPDATE)
    private String updater;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    其中,FieldFill枚举有4个属性,

DEFAULT :默认不处理
INSERT : 插入操作时进行填充字段
UPDATE :更新操作时填充字段
INSERT_UPDATE :插入和更新操作时填充字段
三. 不生效的场景
按照上文步骤配置了后,在新增和更新实体对象时,就会自动赋值了,但是,并不是所有场景都会自动填充的,有一些失效场景需要注意:

  1. 使用mapper.xml的sql不生效
    必须使用mybatis的api进行插入和更新操作。

  2. boolean update(Wrapper updateWrapper) 不生效
    不生效方式:

this.update( new UpdateWrapper()
.set(“name”, “张三”))
);
1
2
3
生效方式:

this.update(new User(), new UpdateWrapper()
.set(“name”, “张三”))
);
1
2
3
3. @TableField注解要加上
@TableField(value = “update_time”, fill = FieldFill.UPDATE)
实现接口后,此注解也要加,并且指定fill参数值,不然不会填充。

  1. 其他
    如果属性有值则不覆盖,如果sql中赋值了,自动填充又设置为其他值,则已sql中的值为准‘
    如果填充值为null则不填充;比如this.setFieldValByName(“update_time”, null, metaObject); 实际是不会更新为null的;

3.1.0版本的中的更新时间不生效,可以升级为3.3.0版本,然后使用如下方式:

this.strictUpdateFill(metaObject, “updateTime”, LocalDateTime.class, LocalDateTime.now());
1
以上是MetaObjectHandler的使用方式以及需要注意的点;
不同的版本使用方式略有不同,如果不生效,可以通过以下两个方法排查:

阅读所对应版本的官方使用文档;
代码调试,跟以下代码,一般就知道失效原因了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值