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

 更新时间:2020年10月02日 09:36:12   作者:码农小胖哥  
这篇文章主要给大家介绍了关于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接口:

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

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

@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语句公共字段自动填充内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • dataGrip显示clickhouse时间字段不正确的问题

    dataGrip显示clickhouse时间字段不正确的问题

    最近做数据迁移碰到一个问题,源数据和目的端数据,导入的时间怎么都差8个小时,本文就来介绍一下如何解决,感兴趣的可以了解一下
    2021-09-09
  • YII2数据库查询实践

    YII2数据库查询实践

    这篇文章主要介绍了YII2数据库查询实践的相关资料,需要的朋友可以参考下
    2016-01-01
  • 使用Navicat生成ER关系图并导出的方法

    使用Navicat生成ER关系图并导出的方法

    这篇文章主要介绍了使用Navicat生成ER关系图并导出的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 详解PyMySQL插入字典类型的数据

    详解PyMySQL插入字典类型的数据

    在我们爬虫或者调API获取数据后,需要将数据存入到数据库中,如果数据是列表嵌套字典格式的话,一般做法是遍历列表,然后用字典生成对应的SQL语句再执行插入到表中,本文将介绍一种更加简便的方法来插入字典类型的数据,需要的朋友可以参考下
    2022-07-07
  • Navicat for MySQL 乱码问题解决方法

    Navicat for MySQL 乱码问题解决方法

    这篇文章主要介绍了Navicat for MySQL 乱码问题解决方法,Navcat是Windows常用的Mysql管理软件,本文讲解它出现乱码的解决方法,需要的朋友可以参考下
    2015-02-02
  • SQL Prompt--绝好的SQL语法提示工具

    SQL Prompt--绝好的SQL语法提示工具

    SQL Prompt--绝好的SQL语法提示工具...
    2007-03-03
  • 浅析sql server 公共表达式的简单应用

    浅析sql server 公共表达式的简单应用

    本文主要对sql server 公共表达式的简单应用进行介绍,具有一定的参考价值,有需要的可以看下
    2016-12-12
  • 一个提升PostgreSQL性能的小技巧

    一个提升PostgreSQL性能的小技巧

    这篇文章主要介绍了一个提升Postgres性能的小技巧,通过修改很少的代码来优化查询,需要的朋友可以参考下
    2015-04-04
  • 国产开源数据库openGauss容器部署过程详解

    国产开源数据库openGauss容器部署过程详解

    openGauss是一款开源的关系型数据库管理系统,它具有多核高性能、全链路安全性、智能运维等企业级特性,这篇文章主要介绍了国产开源数据库openGauss容器部署,需要的朋友可以参考下
    2022-08-08
  • SQL注入原理与解决方法代码示例

    SQL注入原理与解决方法代码示例

    这篇文章主要介绍了SQL注入原理与解决方法代码示例,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10

最新评论