本文为 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 深入浅出系列》