MybatisPlus的MetaObjectHandler與@TableLogic使用
1.MetaObjectHandler 實(shí)現(xiàn)公共字段自動(dòng)填充功能
1.1 日常開(kāi)發(fā)中的公共字段
在日常的開(kāi)發(fā)過(guò)程中, DAO
層的數(shù)據(jù)庫(kù)實(shí)體類(lèi)(Entity
)中經(jīng)常會(huì)有一些公共字段如 create_by
(創(chuàng)建人), create_time
(創(chuàng)建時(shí)間) 等字段,與業(yè)務(wù)基本無(wú)關(guān)且屬于記錄本身的屬性字段。
這些字段通常會(huì)容易被大家忽視,每個(gè) Entity 都去處理一遍比較麻煩耗時(shí);如果忽略又會(huì)造成記錄本身屬性不完整,直到用到的時(shí)候才后悔莫及。
1.2 Mybatis Plus 中的解決方案
所以 Mybatis Plus
中的 MetaObjectHandler
就是針對(duì)這一問(wèn)題的良好解決方案。
MetaObjectHandler
中主要提供了兩個(gè)方法:
public interface MetaObjectHandler { /** * 插入元對(duì)象字段填充(用于插入時(shí)對(duì)公共字段的填充) * * @param metaObject 元對(duì)象 */ void insertFill(MetaObject metaObject); /** * 更新元對(duì)象字段填充(用于更新時(shí)對(duì)公共字段的填充) * * @param metaObject 元對(duì)象 */ void updateFill(MetaObject metaObject); }
1.3 用法
1.3.1 定義公共字段超類(lèi),并在字段上添加注解
一般來(lái)說(shuō),這些公共字段我們都會(huì)封裝在一個(gè) Super Entity
類(lèi)中,所以在這個(gè)類(lèi)中,我們把所有更新和插入時(shí)需要做改動(dòng)的字段都加上 @TableField
注解,并且設(shè)置 fill
屬性。
舉例說(shuō)明:
@Data public class BaseEntity implements Serializable { /** * 創(chuàng)建時(shí)間 */ @TableField(value = "create_time", fill = FieldFill.INSERT) private Date createTime; /** * 更新時(shí)間 */ @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
FieldFill
是一個(gè)枚舉類(lèi),其中定義了四種處理方法:
public enum FieldFill { /** * 默認(rèn)不處理 */ DEFAULT, /** * 插入時(shí)填充字段 */ INSERT, /** * 更新時(shí)填充字段 */ UPDATE, /** * 插入和更新時(shí)填充字段 */ INSERT_UPDATE }
1.3.2 實(shí)現(xiàn) MetaObjectHandler 接口
定義一個(gè)類(lèi)實(shí)現(xiàn) MetaObjectHandler
中的 insertFill
和 updateFill
抽象方法:
public class MetaHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // getFieldValByName 方法是父接口中的默認(rèn)方法,用字段名字通過(guò)反射獲取待插入對(duì)象中指定名字字段的值 Object createTime = getFieldValByName("createTime", metaObject); if (Objects.isNull(createTime)) { //同理, setFieldValByName 方法也是父接口中的默認(rèn)方法,用字段名字通過(guò)反射設(shè)置待插入對(duì)象中指定名字字段的值 //插入時(shí), createTime 字段默認(rèn)為當(dāng)前時(shí)間 setFieldValByName("createTime", new Date(), metaObject); } Object updateTime = getFieldValByName(UPDATE_TIME_FIELD, metaObject); if (Objects.isNull(updateTime)) { setFieldValByName(UPDATE_TIME_FIELD, new Date(), metaObject); } } @Override public void updateFill(MetaObject metaObject) { //更新時(shí)設(shè)置 updateTime 字段為當(dāng)前時(shí)間 setFieldValByName(UPDATE_TIME_FIELD, LocalDateTime.now(), metaObject); } }
2. Mybatis Plus 實(shí)現(xiàn)邏輯刪除
2.1 目前的邏輯刪除
日常開(kāi)發(fā)中,大多數(shù)場(chǎng)景下數(shù)據(jù)并不需要物理刪除,而是采用一個(gè)字段來(lái)表示這個(gè)字段是否刪除,也就是邏輯刪除。
通常情況下,我們需要在刪除的時(shí)候手動(dòng)將這個(gè)值更新為被刪除的枚舉值。
2.2 Mybatis Plus 提供的解決方案
在 Mybatis Plus
中,提供了一個(gè) @TableLogic
注解, 代碼如下:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface TableLogic { /** * 默認(rèn)邏輯未刪除值(該值可無(wú)、會(huì)自動(dòng)獲取全局配置) */ String value() default ""; /** * 默認(rèn)邏輯刪除值(該值可無(wú)、會(huì)自動(dòng)獲取全局配置) */ String delval() default ""; }
所以當(dāng)我們需要用到邏輯刪除的字段時(shí),可以使用如下方式:
@TableLogic(delval = "1", value = "0") private String delete;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志
這篇文章主要介紹了利用grep-console插件使Intellij idea顯示多顏色調(diào)試日志,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Spring Security使用單點(diǎn)登錄的權(quán)限功能
本文主要介紹了Spring Security使用單點(diǎn)登錄的權(quán)限功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04如何處理@PathVariable中的特殊字符問(wèn)題
這篇文章主要介紹了如何處理@PathVariable中的特殊字符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Mybatis-Plus Wrapper條件構(gòu)造器超詳細(xì)使用教程
接口方法的參數(shù)中,會(huì)出現(xiàn)各種 Wrapper,比如 queryWrapper、updateWrapper 等。Wrapper 的作用就是用于定義各種各樣的條件(where)。所以不管是查詢(xún)、更新、刪除都會(huì)用到Wrapper2022-03-03Java中this,static,final,const用法詳解
這篇文章主要介紹了Java中this,static,final,const用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07