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 * <p> 12 * 新闻中心 13 * </p> 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 }