文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SQL语句中如何实现公共字段的自动填充方法

2024-04-02 19:55

关注

这篇文章主要介绍了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;
 }
}

这样我们就不用再关心这几个公共字段了,当然你可以根据需要添加更多你需要填充的字段。

感谢你能够认真阅读完这篇文章,希望小编分享的“SQL语句中如何实现公共字段的自动填充方法”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯