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语法、语义的解析技术,记录下数据库的所有访问和操作行为。有空可以从网上获取相关的资料进行了解。
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]