一、前言

在项目中,我们有一些公共的字段需要做修改
如:

  1. gmt_create:创建时间
  2. creator_id:创建人
  3. gmt_modified:修改时间
  4. modifier_id:修改人

这时候我们可以采用 MyBatis-Plus 中的字段自动填充功能去实现

思路:抽取公用字段封装到BaseEntity类中,再将使用到此公共字段的类继承基类,最后由 MyBatis-Plus 帮我们实现自动填充,这样我们便可以在service服务类中减少一定代码重复量!

二、实现

1. 实体类
@Data
@TableName("t_user")
public class User extends BaseEntity<User> {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Integer id;@TableField("username")private String username;@Overrideprotected Serializable pkVal() {return this.id;}
}
2. 公用字段 - 使用注解填充字段,如:@TableField(fill = FieldFill.INSERT)
@Getter
@Setter
public abstract class BaseEntity<T extends Model> extends Model {/*** 创建日期 - 现在时表示主动创建*/@TableField(value = "gmt_create", fill = FieldFill.INSERT)private Date gmtCreate;/*** 修改时间 - 过去分词表示被动更新*/@TableField(value = "gmt_modified", fill = FieldFill.INSERT_UPDATE)private Date gmtModified;
}
Ctrl 选中FieldFill进入源码可查看相应字段填充策略枚举类,如下:
public enum FieldFill {DEFAULT(0, "默认不处理"),INSERT(1, "插入填充字段"),UPDATE(2, "更新填充字段"),INSERT_UPDATE(3, "插入和更新填充字段");/*** 主键*/private final int key;/*** 描述*/private final String desc;FieldFill(final int key, final String desc) {this.key = key;this.desc = desc;}public static FieldFill getIgnore(int key) {FieldFill[] fis = FieldFill.values();for (FieldFill fi : fis) {if (fi.getKey() == key) {return fi;}}return FieldFill.DEFAULT;}public int getKey() {return this.key;}public String getDesc() {return this.desc;}
}
3. 自定义MyMetaObjectHandler字段自动填充处理类继承MetaObjectHandler

注:在 Spring Boot 中需要声明@Component 注入

/***  <p> MyBatisPlus自定义字段自动填充处理类 - 实体类中使用 @TableField注解 </p>** @description: 注意前端传值时要为null* @author: zhengqing* @date: 2019/8/18 0018 1:46*/
@Component
public class MyMetaObjectHandler extends MetaObjectHandler {private static final Logger LOG = LoggerFactory.getLogger(MyMetaObjectHandler.class);/*** 创建时间*/@Overridepublic void insertFill(MetaObject metaObject) {LOG.info(" -------------------- start insert fill ...  --------------------");if (metaObject.hasGetter("gmtCreate") && metaObject.hasGetter("gmtModified")) {setFieldValByName("gmtCreate", new Date(), metaObject);setFieldValByName("gmtModified", new Date(), metaObject);}}/*** 最后一次更新时间*/@Overridepublic void updateFill(MetaObject metaObject) {LOG.info(" -------------------- start update fill ...  --------------------");if (metaObject.hasGetter("et.gmtModified")) {setFieldValByName("gmtModified", new Date(), metaObject);}}}

温馨小提示:

我们在更新字段的时候要使用 et.字段名 或者 param1.字段 才会生效!

原因:我们可以debug模式查看metaObject中的属性发现多了et

或者 查看继承的BaseMapper类源码,我们也可以发现更新的方法中都有et


而插入的方法并没有et

另外一个注意点就是,自动填充是在执行完插入或更新方法之后,也就是说,MyBatis-Plus会在方法之后判断@TableField注解的字段有没有被手动更新,如果没有才会走自定义的实现类MyMetaObjectHandler

【MyBatis-Plus】实现字段自动填充功能相关推荐

  1. MySQL实现字段自动填充功能

    根据阿里巴巴开发手册,有这么一句话:所有的数据库表当中必须有gmt_create.gmt_modified,几乎所有的表都要配置上!而且需要自动化!!! 对于创建时间.修改时间这些字段,我们是希望在添 ...

  2. SpringBoot公共字段自动填充

    大家好,我是小羽,今天做项目的时候遇到一个问题,每次添加数据时都要设置创建时间,创建人,修改时间,修改人等字段,实在是太繁琐了.那我能不能让他们添加这些字段的信息呢? 问题分析 创建时间,创建人,修改 ...

  3. MyBatis-Plus 高级功能 —— 自动填充功能

    一.引言 小编先来解释下自动填充是做什么的,大家有没有在数据入库的时候,不管新增或者修改数据,都要手动来设置添加时间和修改时间.而且每个插入都需要设置,而且数据库还设置不能为空,就很烦恼. 虽然可以在 ...

  4. 数据库公共字段自动填充

    引言 很多项目的数据库表都会设置create_time.update_time等公共字段,这些公共字段都是在数据库创建或更新时需要设置值:如果自己设置还需要额外写set代码,一旦这样的表多了之后就很麻 ...

  5. MyBatis-Plus——自动填充功能实现

    文章目录 MyBatis-Plus--自动填充功能 1.什么是自动填充 2.数据库层面实现 3.编程实现(推荐) MyBatis-Plus--自动填充功能 1.什么是自动填充 有些表中会有更新时间up ...

  6. MyBatis-plus自动填充功能之自动填充时间

    MyBatis-plus自动填充功能之自动填充时间 一.前期工作 二.自动填充 2.1 数据库级别 2.2 代码级别 在实际操作过程中,我们并不希望创建时间.修改时间这些来手动进行,而是希望通过自动化 ...

  7. Mybatis-plus的自动填充功能

    1.概述 在我们开发过程中,经常需要做一些插入操作,有些麻烦,特别是对于一些每次插入或修改都需要改变的的一些字段,例如创建时间和修改时间两个字段,和数据没什么关系但是每次修改都需要被动修改这两个字段, ...

  8. MyBatisPlus-9-公共字段自动填充

    公共字段自动填充 1.1 元数据处理器接口 com.baomidou.mybatisplus.mapper.MetaObjectHandlerinsertFill(MetaObject metaObj ...

  9. mpp新增一个字段_mybatisplus使用@InsertFill和@UpdateFill注解设置自定义sql对字段自动填充...

    自动填充优化功能 原生mybatisplus只能做%s+1和now两种填充,mybatisplus-plus在插入或更新时对指定字段进行自定义复杂sql填充. 需要在实体类字段上用原生注解@Table ...

最新文章

  1. 技术 | 苹果最新博文剑指汉字手写识别!专家回应:并没有技术含量
  2. 物联网的层次结构如何划分?
  3. 介绍一个很好用的Rsa加解密的.Net库 Kalix.ApiCrypto
  4. 设计模式在Netty中的应用-装饰者模式源码举例
  5. 配置linux系统ip,Linux系统IP地址配置
  6. 《绅士》Typecho个人博客模板主题
  7. pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL
  8. windows下consul安装启动
  9. ByteBuffer 转 InputStream
  10. pg 事务 存储过程_PgpoolII实现数据分区存储及性能分析
  11. 马斯克:大量特斯拉汽车将会在年底前交付
  12. 华为笔试题 简答错误记录(字符串处理,好题!!!)
  13. Chrome三天内的第二枚0Day
  14. win10解决设置默认打开方式不生效问题(双击每次都要选择默认打开程序)
  15. c语言合并两个顺序表算法,顺序表的两种合并操作(C语言)
  16. 使用U盘制做CentOS7.6安装盘并安装CentOS7.6系统
  17. springboot配置进行https请求访问demo
  18. Javascript的优点和缺点
  19. 【电子器件笔记6】三极管(BJT)参数和选型
  20. RK3399适配OV8858摄像头

热门文章

  1. 组装k39小钢炮(ubuntu16.04),了解一下!
  2. IE低版本提示下载新的浏览器js--IEOutTips.zip
  3. 三进网吧后,我“被跳槽”了!
  4. [转贴]电脑使用者的眼睛保护须知
  5. 制作可执行的JAR文件包及jar命令详解
  6. usb转vga转换器
  7. 程序员编程的专业名言
  8. win10便签常驻桌面_出奇的好用!聊聊被习惯性忽视的Win10“便笺”
  9. sentinel降级规则
  10. Oracle HR 样例用户的建立 10g,11g均可