• 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);
            }
        }
    }
  • 相关阅读:
    如何面试程序员?
    开始做项目
    ===
    依赖注入获得一个对象却想返回不同的值(Error)
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not reread row data for column 4.
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
    .net 4.5新特性
    有限状态机简单示例
    JavaScript入门经典(第四版)文摘
    小强升职记读后感
  • 原文地址:https://www.cnblogs.com/jwen1994/p/14536631.html
Copyright © 2020-2023  润新知