共計 2189 個字符,預計需要花費 6 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章主要介紹了 SQL 語句中如何實現公共字段的自動填充方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
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;
}
}
這樣我們就不用再關心這幾個公共字段了,當然你可以根據需要添加更多你需要填充的字段。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“SQL 語句中如何實現公共字段的自動填充方法”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!
向 AI 問一下細節