好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQL语句中公共字段的自动填充方法

1. 前言

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

2. 通用方式

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

2.1 开发Mybatis审计插件

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

2.2 Mybatis Plus 自动填充

如果你使用了Mybatis Plus,可以借助于其自动填充功能来实现。

基于 Mybatis Plus 3.3.0

只需要实现MetaObjectHandler接口:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@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>把公共审计字段放进去并声明对应的填充策略:

?

1

2

3

4

5

6

7

8

9

10

11

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>:

?

1

2

3

4

5

6

7

8

9

10

11

12

@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语法、语义的解析技术,记录下数据库的所有访问和操作行为。有空可以从网上获取相关的资料进行了解。

到此这篇关于SQL语句中公共字段的自动填充方法的文章就介绍到这了,更多相关SQL语句公共字段自动填充内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/felordcn/p/13752898.html

查看更多关于SQL语句中公共字段的自动填充方法的详细内容...

  阅读:30次