如何自动填充SQL语句中的公共字段

1. 前言

咱们在设计数据库的时候必定会带上新增、更新的时间、操做者等审计信息。 之因此带这些信息是由于假若有一天公司的数据库被人为删了,尽管可能有数据库备份能够恢复数据。可是咱们仍然须要追踪到这个事是谁干的,在什么时间干的,具体干了哪些事等等,方便定责和修补。可是咱们变动每条数据都要去显式变动这些信息就十分繁琐,咱们但愿无感知的来处理这些信息。java

2. 通用方式

那么有什么好的解决思路呢?在Spring Data框架中提供@CreatedBy@LastModifiedBy来捕捉谁建立或修改的实体以及@CreatedDate@LastModifiedDate来捕捉合适建立或修改了实体。若是你使用相关的框架就可使用这些特性。那么其实咱们知道国内Spring Data JDBCSpring Data JPA并非主流,主流的是Mybatis。那么咱们有哪些选择?数据库

2.1 开发Mybatis审计插件

若是你使用了原生的Mybatis能够编写一个审计插件来实现这些功能。我在以前讲解过Mybatis插件的教程,并非很是难的事。若是你想拿来就用,其实GitHub上提供了不少可供选择的Mybatis审计组件,原本我打算手写一个,可是确实人家写的好。你能够经过关键词Mybatis Audit来搜索到它们选择一款最适合你的。编程

2.2 Mybatis Plus 自动填充

若是你使用了Mybatis Plus,能够借助于其自动填充功能来实现。框架

基于 Mybatis Plus 3.3.0

只须要实现MetaObjectHandler接口:ide

@Component
public class MybatisAuditHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // 声明自动填充字段的逻辑。
        String userId = AuthHolder.getCurrentUserId();
        this.strictInsertFill(metaObject,"creator",String.class, userId);
        this.strictInsertFill(metaObject,"createTime", LocalDateTime.class,LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 声明自动填充字段的逻辑。
        String userId = AuthHolder.getCurrentUserId();
        this.strictUpdateFill(metaObject,"updater",String.class,userId);
        this.strictUpdateFill(metaObject,"updateTime", LocalDateTime.class,LocalDateTime.now());
    }
}

而后咱们扩展一下Mybatis PlusModel<T>把公共审计字段放进去并声明对应的填充策略:this

public abstract class BaseEntity<T extends Model<?>> extends Model<T> {

    @TableField(fill = FieldFill.INSERT)
    private String creator;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime addTime;
    @TableField(fill = FieldFill.UPDATE)
    private String updater;
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
}

最后咱们的实体类再也不直接继承Model<T>改成上面的BaseEntity<T>spa

@Data
@EqualsAndHashCode(callSuper = false)
public class UserInfo extends BaseEntity<UserInfo> {
    @TableId(value = "user_id", type = IdType.ASSIGN_ID)
    private String userId;
    private String username;

    @Override
    protected Serializable pkVal() {
        return this.userId;
    }
}

这样咱们就不用再关心这几个公共字段了,固然你能够根据须要添加更多你须要填充的字段。插件

3. 总结

今天咱们SQL审计中的一些公共字段的自动填充的经常使用方案进行了一些介绍,特别对Mybatis Plus提供的功能进行了介绍相信可以帮助你简化一些样板代码的编写。可是SQL审计并不单单这么简单,根据你的业务的不一样会有不一样的设计。若是设计的更加精细化的话,会经过镜像或探针的方式采集全部数据库的访问流量,并基于SQL语法、语义的解析技术,记录下数据库的全部访问和操做行为。有空能够从网上获取相关的资料进行了解。今天就到这里,关注:码农小胖哥,获取更多的编程实战干货。设计

关注公众号:Felordcn 获取更多资讯code

我的博客:https://felord.cn

相关文章
相关标签/搜索