前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何自动填充SQL语句中的公共字段

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

作者头像
用户5546570
发布2020-10-10 11:24:28
2.2K0
发布2020-10-10 11:24:28
举报
文章被收录于专栏:以Java架构赢天下

写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master

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

1. 前言

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

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

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

代码语言:javascript
复制
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> :

代码语言:javascript
复制
@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语法、语义的解析技术,记录下数据库的所有访问和操作行为。

来源:https://www.tuicool.com/articles/im6nmuq

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. 通用方式
  • 2.1 开发Mybatis审计插件
  • 2.2 Mybatis Plus 自动填充
  • 基于 Mybatis Plus 3.3.0
  • 3. 总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档