mybatis数据库字段自动填充
阅读原文时间:2023年09月06日阅读:3

背景描述

目前,大多数项目的数据库设计,都会添加一些公共字段,比如version(版本号)、deleted(逻辑删除标识)、create_time、update_time、create_by、update_by,这些字段都是在各个业务里分开处理的。

这是,mybatis给我们提供了一种便利的方式,采用切面的方式进行实现。

实现过程

第一步,直接上代码

import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

/**
* 数据库公共字段填充
*/
@Configuration
public class MapperObjectHandler implements MetaObjectHandler {

// 通常项目会有登录拦截,然后将用户信息缓存到当前线程,这里可以根据实际项目实现,也可参考我其它博客实现登录信息缓存  
@Autowired  
CacheService cacheService;

/\*\* 数据库int类型字段默认值 \*/  
private static final int DEFAULT\_DB\_INIT\_DELETED\_VALUE = 0;  
private static final int DEFAULT\_DB\_INIT\_VERSION\_VALUE = 1;

@Override  
public void insertFill(MetaObject metaObject) {  
    String username;  
    if (cacheService.getUserInfo() == null) {  
        username = "nc";  
    } else {  
        username = cacheService.getUserInfo().getNickname();  
    }

    this.setFieldValByName("deleted", DEFAULT\_DB\_INIT\_DELETED\_VALUE, metaObject);  
    this.setFieldValByName("version", DEFAULT\_DB\_INIT\_VERSION\_VALUE, metaObject);

    if (this.getFieldValByName("createBy", metaObject) == null) {  
        this.setFieldValByName("createBy", username, metaObject);  
    }  
    if (this.getFieldValByName("createTime", metaObject) == null) {  
        this.setFieldValByName("createTime", new Date(), metaObject);  
    }  
    this.setFieldValByName("updateBy", username, metaObject);  
    this.setFieldValByName("updateTime", new Date(), metaObject);  
}

@Override  
public void updateFill(MetaObject metaObject) {  
    String username;  
    if (cacheService.getUserInfo() == null) {  
        username = "nc";  
    } else {  
        username = cacheService.getUserInfo().getNickname();  
    }

    Object versionObj = this.getFieldValByName("version", metaObject);  
    version += 1;  
    this.setFieldValByName("version", version, metaObject);

    if (this.getFieldValByName("updateBy", metaObject) == null) {  
        this.setFieldValByName("updateBy", username, metaObject);  
    }  
    this.setFieldValByName("updateTime", new Date(), metaObject);  
}

}

mybatis提供了MeteObjectHandler接口,继承这个接口即可自定义实现字段填充,这个接口也提供了大量方法,大家也可以进去看下源码,直接采用如下方法来实现。

第二步,抽离公共字段,新建公共字段基类(以下省略get和set方法)

public class BaseEntity {

@TableLogic  
@TableField(fill = FieldFill.INSERT)  
private Integer deleted;

@TableField(fill = FieldFill.INSERT\_UPDATE)  
private Integer version;

@TableField(fill = FieldFill.INSERT)  
private Date createTime;

@TableField(fill = FieldFill.INSERT\_UPDATE)  
private Date updateTime;

@TableField(fill = FieldFill.INSERT)  
private String createBy;

@TableField(fill = FieldFill.INSERT\_UPDATE)  
private String updateBy;  

}

一般有两个场景需要填充默认值,insert和update,根据实际场景配置就好,@TableLogic是mybatisplus的逻辑删除注解,大家有兴趣的可以自行查找资料。

然后,大家将自己的数据库实体继承这个基类就完成了。

这样就配置完了,就是这么简单,赶快在自己的项目中用起来吧。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器