MybatisPlus自动填充公共字段的策略


背景:数据库中多个表有时间字段,并且字段名一致

需求:该时间字段由MybatisPlus自动插入和更新,业务代码无需处理

方法:

   一、创建基础实体【BaseEntity】,定义需要处理的公共字段(创建时间、修改时间、创建人、修改人、备注……),供其他业务实体类继承

    

 1 import com.baomidou.mybatisplus.annotations.TableField;
 2 import com.baomidou.mybatisplus.enums.FieldFill;
 3 import lombok.Data;
 4 
 5 import java.io.Serializable;
 6 import java.util.Date;
 7 
 8 /**
 9  * @ClassName BaseEntity
10  * @Description 定义时间的基类
11  * @Author AAFE
12  * @Date 2019/12/3 17:39
13  * @Version 1.0
14  **/
15 @Data
16 public class BaseEntity implements Serializable {
17 
18 
19     @TableField(value = "d_create_time", fill = FieldFill.INSERT)
20     private Date createTime;
21 
22 
23     @TableField(value = "d_update_time", fill = FieldFill.INSERT_UPDATE)
24     private Date updateTime;
25 
26 
27 }

   二、创建元数据处理器【MetaHandler】,继承自MetaObjectHandler

  

 1 import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
 2 import org.apache.ibatis.reflection.MetaObject;
 3 import org.springframework.stereotype.Component;
 4 
 5 import java.util.Date;
 6 
 7 /**
 8  * @ClassName MetaHandler
 9  * @Description 处理新增和更新的基础数据填充,配合BaseEntity和MyBatisPlusConfig使用
10  * @Author AAFE
11  * @Date 2019/12/3 17:28
12  * @Version 1.0
13  **/
14 @Component
15 public class MetaHandler extends MetaObjectHandler {
16 
17     /**
18      * 新增数据执行
19      * @param metaObject
20      */
21     @Override
22     public void insertFill(MetaObject metaObject) {
23         this.setFieldValByName("createTime", new Date(), metaObject);
24         this.setFieldValByName("updateTime", new Date(), metaObject);
25     }
26 
27     /**
28      * 更新数据执行
29      * @param metaObject
30      */
31     @Override
32     public void updateFill(MetaObject metaObject) {
33         this.setFieldValByName("updateTime", new Date(), metaObject);
34     }
35 
36 }

   三、创建配置文件【MybatisPlusConfig】,全局注入元数据处理器

    

 1 import com.baomidou.mybatisplus.spring.boot.starter.GlobalConfig;
 2 import org.springframework.context.annotation.Bean;
 3 import org.springframework.context.annotation.Configuration;
 4 
 5 /**
 6  * @ClassName MyBatisPlusConfig
 7  * @Description 插件配置
 8  * @Author AAFE
 9  * @Date 2019/12/3 17:26
10  * @Version 1.0
11  **/
12 @Configuration
13 public class MyBatisPlusConfig {
14     /**
15      * 自动填充功能
16      * @return
17      */
18     @Bean
19     public GlobalConfig globalConfig() {
20         GlobalConfig globalConfig = new GlobalConfig();
21         globalConfig.setMetaObjectHandler(String.valueOf(new MetaHandler()));
22         return globalConfig;
23     }
24 }

   四、创建业务实体类【News】,该实体在进行增加/更新时,时间字段会自动插入数据库,无需代码处理

    

 1 import com.baomidou.mybatisplus.enums.IdType;
 2 import com.baomidou.mybatisplus.annotations.TableId;
 3 import com.baomidou.mybatisplus.annotations.TableField;
 4 import com.baomidou.mybatisplus.annotations.TableName;
 5 
 6 import com.hztech.hzyy.init.base.BaseEntity;
 7 import lombok.Data;
 8 import lombok.experimental.Accessors;
 9 
10 /**
11  * 

12 * 新闻中心 13 *

14 * 15 * @author ${author} 16 * @since 2019-11-23 17 */ 18 @Data 19 @Accessors(chain = true) 20 @TableName("t_web_news") 21 public class News extends BaseEntity { 22 23 24 /** 25 * 自增ID 26 */ 27 @TableId(value = "n_id", type = IdType.AUTO) 28 private Integer id; 29 /** 30 * 内容 31 */ 32 @TableField("c_area") 33 private String area; 34 /** 35 * 封面 36 */ 37 @TableField("c_cover") 38 private String cover; 39 /** 40 * 上下架默认0:1:下架;2:上架 41 */ 42 @TableField("n_stand") 43 private Integer stand; 44 /** 45 * 标题 46 */ 47 @TableField("c_title") 48 private String title; 49 50 51 @TableField("n_type") 52 private Integer type; 53 54 55 56 }