zoukankan      html  css  js  c++  java
  • 小书MybatisPlus第9篇-常用字段默认值自动填充

    本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下:

    一、填充字段处理

    需求案例:在插入数据的时候自动填充createTime和updateTime为当前插入数据的时间,在数据更新的时候修改updateTime为修改数据的时间。不需要人为的手动赋值。

    • 在数据库表层面需要先添加2个日期类型的字段create_tme和update_time

    填充字段处理-数据库新建字段

    • 使用@TableField注解标记实体类中的哪些字段需要填充:
    @Data
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
    }
    

    FieldFill是一个枚举,用于指定在何种情况下会自动填充,有如下几种可选值:

    • DEFAULT:默认不处理
    • INSERT:插入时自动填充字段
    • UPDATE:更新时自动填充字段
    • INSERT_UPDATE:插入和更新时自动填充字段

    二、自定义填充默认数值

    编写公共字段填充处理器类,该类继承了MetaObjectHandler类,重写 insertFill和updateFill方法,我们在这两个方法中获取需要填充的字段以及默认填充的值。

    • 填充处理器MyMetaObjectHandler在Spring Boot中需要声明@Component或@Bean注入
    • strictInsertFill和strictUpdateFill方法第二个参数写的是实体类里的属性名,不是对应数据库字段名。
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
     
        @Override
        public void insertFill(MetaObject metaObject) {
            this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
            this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        }
     
        @Override
        public void updateFill(MetaObject metaObject) {
            this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
        }
    }
    

    如果是3.3.0后面的版本,比如3.3.1.8,也可以改用下面更简单的写法(3.3.0不要用该方法,有bug)

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
     
        @Override
        public void insertFill(MetaObject metaObject) {
            this.fillStrategy(metaObject, "createTime", new Date());
            this.fillStrategy(metaObject, "updateTime", new Date());
        }
     
        @Override
        public void updateFill(MetaObject metaObject) {
            this.fillStrategy(metaObject, "updateTime", new Date());
        }
    }
    

    在一些比较旧的版本,为填充字段设置值的API如下,3.3.0之后已经不建议使用

    this.setFieldValByName("createTime",new Date(),metaObject);
     this.setFieldValByName("updateTime",new Date(),metaObject);
    

    三、开始测试

    • 插入一条数据,注意我们没有为createTime和updateTime赋值
    @Test
    public void testInsert() {
      User user = new User();
      user.setName("字母哥");
      user.setAge(18);
    
      userMapper.insert(user);
    }
    

    但是运行的结果是:createTime和updateTime被自动赋值
    createTime和updateTime被自动赋值

    • 根据Id更新一条数据,注意我们没有为updateTime赋值
    @Test
    public void testUpdate() {
      User user = new User();
      user.setId(1287387821681790977L);
      user.setName("字母哥&curry");
      user.setAge(18);
    
      userMapper.updateById(user);
    }
    

    但是运行的结果是:updateTime在执行数据记录修改操作时被自动赋值
    updateTime在执行数据记录修改操作时被自动赋值

    欢迎关注我的博客,里面有很多精品合集

    • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

    觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 相关阅读:
    图的深度遍历
    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

    满汉全席
    2-sat(模板)
    2-sat
    花匠
    维护序列NOI2005
    序列终结者
    杨辉三角
  • 原文地址:https://www.cnblogs.com/zimug/p/13383476.html
Copyright © 2011-2022 走看看