1. 程式人生 > >如何自動填充SQL語句中的公共欄位

如何自動填充SQL語句中的公共欄位

![](https://img2020.cnblogs.com/other/1739473/202009/1739473-20200930085622894-46215229.png) ## 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`介面: ```java @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**