Mybatis Plus 自动填充

一、代码实战

1、注解填充字段

@TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!

//创建时间
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//更新时间
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;

2、自定义实现类 MyMetaObjectHandler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("start insert fill ....");
        setInsertFieldValByName("createTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        System.out.println("start update fill ....");
        setUpdateFieldValByName("updateTime", new Date(), metaObject);
    }
}

注意官网最新的示例修改了方法

@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.strictUpdateFill(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)
    }
}

3、测试代码

@Test
public void insert() {
    User user = new User();
    user.setName("张山");
    user.setAge(48);
    user.setEmail("zhangshan@baomidou.com");
    user.setManagerId(1087982257332887553L);
    int rows = userMapper.insert(user);
    System.out.println("rows===" + rows);
}

@Test
public void update() {
    User user = new User();
    user.setId(1088248166370832385L);
    user.setAge(27);
    int rows = userMapper.updateById(user);
    System.out.println("rows===" + rows);
}

日志输出

start insert fill ....
DEBUG==>  Preparing: INSERT INTO user ( id, name, age, email, manager_id, create_time ) VALUES ( ?, ?, ?, ?, ?, ? ) 
DEBUG==> Parameters: 1371302252912959490(Long), 张山(String), 48(Integer), zhangshan@baomidou.com(String), 1087982257332887553(Long), 2021-03-15 11:28:29.316(Timestamp)
DEBUG<==    Updates: 1
rows===1


start update fill ....
DEBUG==>  Preparing: UPDATE user SET age=?, update_time=? WHERE id=? AND deleted='0' 
DEBUG==> Parameters: 27(Integer), 2021-03-15 11:32:41.799(Timestamp), 1088248166370832385(Long)
DEBUG<==    Updates: 1
rows===1

二、自动填充优化

这个自定义实现类是针对所有类的增改操作,但并不是所有表都有对应的字段,也不是所有对应的字段都需要MP赋值,有些需要程序处理后赋值。这就需要对 MyMetaObjectHandler 进行改造。

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 判断是否有此属性,如果有再进行处理
        boolean hasSetter = metaObject.hasSetter("createTime");
        if (hasSetter) {
            System.out.println("start insert fill ....");
            setInsertFieldValByName("createTime", new Date(), metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 判断属性是否为空,如果为空则进行处理
        Object object = getFieldValByName("updateTime", metaObject);
        if (object == null) {
            System.out.println("start update fill ....");
            setUpdateFieldValByName("updateTime", new Date(), metaObject);
        }
    }
}
原文地址:https://www.cnblogs.com/jwen1994/p/14536631.html