关于spring:小书MybatisPlus第9篇常用字段默认值自动填充

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

  • 小书MybatisPlus第1篇-整合SpringBoot疾速开始增删改查
  • 小书MybatisPlus第2篇-条件结构器的利用及总结
  • 小书MybatisPlus第3篇-自定义SQL
  • 小书MybatisPlus第4篇-表格分页与下拉分页查问
  • 小书MybatisPlus第5篇-Active Record模式精讲
  • 小书MybatisPlus第6篇-主键生成策略精讲
  • 小书MybatisPlus第7篇-代码生成器的原理精讲及应用办法
  • 小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

一、填充字段解决

需要案例:在插入数据的时候主动填充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被主动赋值

  • 依据Id更新一条数据,留神咱们没有为updateTime赋值
@Test
public void testUpdate() {
  User user = new User();
  user.setId(1287387821681790977L);
  user.setName("字母哥&curry");
  user.setAge(18);

  userMapper.updateById(user);
}

然而运行的后果是:updateTime在执行数据记录批改操作时被主动赋值

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

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

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端拆散RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理