背景
mysql數(shù)據(jù)庫表設計的時候,通常都會有這兩個字段————創(chuàng)建時間和更新時間,創(chuàng)建時間即mysql記錄第一次插入的時間,更新時間即mysql記錄發(fā)生更新時的時間。通常的做法都是先創(chuàng)建對象,然后分別對創(chuàng)建時間和更新時間進行賦值,然后再去做持久化操作。那有沒有統(tǒng)一處理的方式呢?有,還非常簡單??旄【幰黄饋砜纯窗桑?/p>
優(yōu)缺點
通常使用一個東西的時候,我們都要知道它優(yōu)缺點,分享干貨之前,我們先來是說下統(tǒng)一處理創(chuàng)建時間和更新時間的優(yōu)缺點吧
優(yōu)點
- 統(tǒng)一處理,在一定程度上減少了代碼的冗長,代碼看起來干凈整潔
- 統(tǒng)一處理,因為不用去每次操作對象,對創(chuàng)建時間和更新時間字段進行賦值操作,在一定程度上減少了邏輯,使開發(fā)人員可以更專注于業(yè)務開發(fā)
- 使用簡單,統(tǒng)一配置后,支持使用注解
缺點
所有的數(shù)據(jù)庫表的創(chuàng)建時間和更新時間字段都要使用統(tǒng)一的字段名稱。
原理
我們使用的是mybatisPlus為我們提供的的一個擴展接口MetaObjectHandler,可以利用這個接口在我們插入或者更新數(shù)據(jù)的時候,給創(chuàng)建時間和更新時間字段設置為當前的系統(tǒng)時間。需要重寫insertFill和updateFill兩個方法即可。
搭建
引入相關pom依賴
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!--mysql驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--druid連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
定義時間填充器handler
/**
* @desc:時間填充器
* @author:liyajie
* @createTime:2021/12/25 18:23
* @version:1.0
*/
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill...");
this.setFieldValByName("createDate", new Date(), metaObject);
this.setFieldValByName("updateDate", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill...");
this.setFieldValByName("updateDate", new Date(), metaObject);
}
}
編寫測試案例
分別編寫controller,service,dao就可以了,大家都會,這里我就省略不寫 。。。。
測試
新增一個王五,我們傳入的報文只有id和name,我們的時間填充器會自動把創(chuàng)建時間和更新時間給填上

image.png

image.png
更新下王五的信息,我們的時間填充器會自動把更新時間給更新

image.png

image.png
注意點
如果持久化對象的創(chuàng)建時間和更新時間傳了值,最終會以傳的值為準
結束
需要源碼的可以關注公眾號【溫故知新之java】,更多干活與你分享。