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

相关文章

  • Navicat12.1系列破解激活教程亲测有效

    Navicat12.1系列破解激活教程亲测有效

    这篇文章主要介绍了 Navicat12.1系列破解激活教程亲测有效,本文给大家介绍的非常详细,对大家的学习或工作工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 让你的insert操作速度增加1000倍的方法

    让你的insert操作速度增加1000倍的方法

    大家平时都会使用insert语句,特别是有时候需要一个大批量的数据来做测试,一条一条insert将会是非常慢的,那么我们如何让我们的inser更快呢。
    2009-08-08
  • Django项目优化数据库操作总结

    Django项目优化数据库操作总结

    这篇文章主要介绍了Django项目中优化数据库操作总结,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家共进步,早日升职加薪
    2021-09-09
  • 一篇文章教会你使用gs_restore导入数据

    一篇文章教会你使用gs_restore导入数据

    gs_restore是GaussDB(DWS)提供的针对gs_dump导出数据的导入工具,下面这篇文章主要给大家介绍了关于如何通过一篇文章教会你使用gs_restore导入数据的相关资料,需要的朋友可以参考下
    2022-09-09
  • SQL Server不存在或访问被拒绝问题的解决

    SQL Server不存在或访问被拒绝问题的解决

    最近做一个项目(Asp.net+Sql Server 2000),在原来开发的机器上运行没有任何问题.但当我在另外一台机器上调试程序(本机调试)的时候,总出现“SQL Server不存在或访问被拒绝”。相信在任何一个搜索网站输入这样的检索词,一定会获得n多的页面。
    2008-04-04
  • mysql "group by"与"order by"的研究--分类中最新的内容

    mysql "group by"与"order by"的研究--分类中最新的内容

    这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况
    2010-06-06
  • 通过navicat导入sql文件的操作方法

    通过navicat导入sql文件的操作方法

    在很多项目当中都有sql文件导入到MySQL数据库的需要,因为有sql数据库文件,这个项目才能正常运行起来,那么现在就来学习一下怎么导入sql文件到navicat里面吧,需要的朋友可以参考下
    2024-03-03
  • 最新Navicat 16  Mac版安装永久激活教程(亲测有效)

    最新Navicat 16  Mac版安装永久激活教程(亲测有效)

    这篇文章主要介绍了最新Navicat 16  Mac版安装永久激活教程(亲测有效),本文通过图文并茂的形式给大家介绍的非常详细,对Navicat 16 永久激活教程感兴趣的朋友一起看看吧
    2022-08-08
  • 站内群发消息三种不同用户量的数据库设计

    站内群发消息三种不同用户量的数据库设计

    很多SNS网站和一部分CMS网站都广泛地应用了站内信这一模块,这个看似简单的东西其实背后隐藏着很多需要设计师重视的设计细节,要做好这个“邮递员”是很不容易的,本文讲述站内群发消息三种不同用户量的数据库设计,逐渐设计一个百万级用户量的站内信群发数据库
    2023-12-12
  • Navicat for SQLite安装使用教程 附安装包

    Navicat for SQLite安装使用教程 附安装包

    这篇文章主要介绍了Navicat for SQLite安装教程 附安装包,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07

最新评论