mybatis-plus 字段填充默认值

开发中,我们常常在数据库的大部分表中喜欢预留一些通用字段,比如插入时间、更新时间、创建人等等,有些字段可以通过数据库表设置列的默认值,有些业务范围的默认值就必须由java来生成,mybaits-plus框架在使用过程,设置了这样一个填充功能,可以发生在DDL操作中。

  • 所有orm实体类,抽离一个父类,包含了通用的字段,并使用@TableField注解fill属性来设置填充的DDL时机
@Data
public abstract class DataEntity implements Serializable {
    /**
     * 主键
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 创建者
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    /**
     * 插入时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date insertTime;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;
}
  • 注册mybatis-plus填充handler处理类
@Component
public class MybatisFillHandler implements MetaObjectHandler {
    private final static Log log = LogFactory.getLog("mybatis-plus-fillHandler");

    @Override
    public void insertFill(MetaObject metaObject) {
        User user = UserUtil.getAdminUser();
        if (Objects.isNull(user)) {
            user = UserUtil.getApiUser();
        }
        if (Objects.nonNull(user)) {
            log.info("开始填充创建者CreateUser");
            this.setInsertFieldValByName("createUser", user.getId(), metaObject);
        }

        log.info("开始填充插入时间InsertTime");
        this.setInsertFieldValByName("insertTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始填充更新时间UpdateTime");
        this.setUpdateFieldValByName("updateTime", new Date(), metaObject);
    }
}
  • 业务实体类集成该父类
@Data
public class Activity extends DataEntity {

    private static final long serialVersionUID = 1L;

    private String name;

    private String url;

    private Long orders;

    private String enable;

    private Long thumb;

    private String type;
}
  • 如果是不同业务有不同的抽离字段,需要用到多个实体类父类,那么我们可以在handler中,使用MetaObject对象来进行判断,例如insertFill(MetaObject metaObject)
@Override
public void insertFill(MetaObject metaObject) {
   String[] setterNames = metaObject.getSetterNames();
   HashSet<String> setterNameSet = new HashSet<>(Arrays.asList(setterNames));
   if(setterNameSet.contains("insertTime")){
       //... to do something
   }
   if(setterNameSet.contains("createUser")){
      //... to do something
   }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 上一节我们学习了mybatis-plus 的自定义全局操作和全局sql注入,这一节我们来学习一下mybatis-p...
    runewbie阅读 989评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,524评论 1 32
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,844评论 0 9
  • 一. Java基础部分.................................................
    wy_sure阅读 3,955评论 0 11
  • .数据库 数据库的发展: 文件系统(使用磁盘文件来存储数据)=>第一代数据库(出现了网状模型,层次模型的数据库)=...
    小Q逛逛阅读 1,067评论 0 2

友情链接更多精彩内容