在有些情況下,我們需要對數據的歷史實現記錄,比如當用戶信息發生變更時,我們需要記錄這個變化的數據,比如
張三從A部門轉移到B部門。這個時候,我們一般的做法是 直接數據日志記錄。
這樣導致的情況時,我們需要在各個模塊來編寫這塊代碼。這樣會導致到處都需要寫日志的記錄。
比較好的辦法是:
能夠通過統一封裝的方式來實現這個。
具體思路是:
1.日志數據庫表設計
字段名 | 類型 | 注解 |
id | int | 主鍵 |
table | varchar(30) | 變更數據的表名 |
field | varchar(30) | 變更的i段 |
recordId | varchar(30) | 變更數據主鍵 |
valueBefore | varchar(2000) | 變更前 |
valueAfter | varchar(2000) | 變更后 |
operatorId | varchar(30) | 操作人ID |
operatorName | varchar(30) | 操作人 |
createTime | datetime | 操作時間 |
2.在需要變更的類編寫注解。
編寫兩個注解
HistoryTable
HistoryField
@HistoryTable("employee") class User{ @HistoryField("department") private String department; }
3.在更新數據的時候,不直接調用dao 去更新數據庫,而是通過代理的方式,或者使用切面的方式來實現。
public class UpdateAgent { void update(BaseDao baseDao,Object entity,String pk){ compareAndRecordHistory(entity,pk); baseDao.update(entity); } //獲取變更字段,進行數據插入。 private void compareAndRecordHistory(Object entity,String pk){ } }
這個compareAndRecordHistory方法可以先反射需要變更的字段,從表中獲取原記錄,獲取當前的數據記錄,比較看看是否發生了變更,
如果有變更則進行記錄。
這樣我們就很優雅的進行了變更記錄,開發者都不用關心歷史數據的記錄了。