咱们在设计数据库的时候必定会带上新增、更新的时间、操做者等审计信息。 之因此带这些信息是由于假若有一天公司的数据库被人为删了,尽管可能有数据库备份能够恢复数据。可是咱们仍然须要追踪到这个事是谁干的,在什么时间干的,具体干了哪些事等等,方便定责和修补。可是咱们变动每条数据都要去显式变动这些信息就十分繁琐,咱们但愿无感知的来处理这些信息。java
那么有什么好的解决思路呢?在Spring Data框架中提供@CreatedBy
和@LastModifiedBy
来捕捉谁建立或修改的实体以及@CreatedDate
和@LastModifiedDate
来捕捉合适建立或修改了实体。若是你使用相关的框架就可使用这些特性。那么其实咱们知道国内Spring Data JDBC、Spring Data JPA并非主流,主流的是Mybatis。那么咱们有哪些选择?数据库
若是你使用了原生的Mybatis能够编写一个审计插件来实现这些功能。我在以前讲解过Mybatis插件的教程,并非很是难的事。若是你想拿来就用,其实GitHub上提供了不少可供选择的Mybatis审计组件,原本我打算手写一个,可是确实人家写的好。你能够经过关键词Mybatis Audit来搜索到它们选择一款最适合你的。编程
若是你使用了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 Plus的Model<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; } }
这样咱们就不用再关心这几个公共字段了,固然你能够根据须要添加更多你须要填充的字段。插件
今天咱们SQL审计中的一些公共字段的自动填充的经常使用方案进行了一些介绍,特别对Mybatis Plus提供的功能进行了介绍相信可以帮助你简化一些样板代码的编写。可是SQL审计并不单单这么简单,根据你的业务的不一样会有不一样的设计。若是设计的更加精细化的话,会经过镜像或探针的方式采集全部数据库的访问流量,并基于SQL语法、语义的解析技术,记录下数据库的全部访问和操做行为。有空能够从网上获取相关的资料进行了解。今天就到这里,关注:码农小胖哥,获取更多的编程实战干货。设计
关注公众号:Felordcn 获取更多资讯
code