Mybatis-Plus中的MetaObjectHandler組件的使用
簡(jiǎn)介
MetaObjectHandler
是一個(gè)非常有用的組件,用于處理實(shí)體對(duì)象中的字段填充邏輯,比如自動(dòng)填充創(chuàng)建時(shí)間、更新時(shí)間、創(chuàng)建人、修改人等字段。
設(shè)計(jì)理念
在現(xiàn)代應(yīng)用程序中,數(shù)據(jù)庫(kù)記錄的維護(hù)常常涉及到類(lèi)似于“創(chuàng)建時(shí)間”、“更新時(shí)間”等公共字段。如果在每次插入或更新操作中都手動(dòng)處理這些字段,不僅容易出錯(cuò),還增加了代碼的冗余。MetaObjectHandler 的設(shè)計(jì)初衷正是為了簡(jiǎn)化這一過(guò)程,使得這些公共字段的處理變得自動(dòng)化和無(wú)感知。
自動(dòng)填充的優(yōu)勢(shì)
自動(dòng)填充不僅減少了代碼的冗余,還提高了數(shù)據(jù)的一致性和完整性。通過(guò)自動(dòng)填充,開(kāi)發(fā)者可以確保每次數(shù)據(jù)庫(kù)操作都遵循相同的規(guī)則,避免了人為錯(cuò)誤。此外,自動(dòng)填充還可以提高開(kāi)發(fā)效率,使開(kāi)發(fā)者能夠?qū)W⒂跇I(yè)務(wù)邏輯的實(shí)現(xiàn)。
組件介紹
MetaObjectHandler
接口允許在不修改業(yè)務(wù)代碼的情況下,對(duì)實(shí)體類(lèi)中的字段進(jìn)行自動(dòng)填充。這通常用于記錄創(chuàng)建時(shí)間、更新時(shí)間、創(chuàng)建人、修改人等元數(shù)據(jù)信息。例如,在用戶(hù)注冊(cè)時(shí)自動(dòng)設(shè)置創(chuàng)建時(shí)間,在更新用戶(hù)信息時(shí)自動(dòng)更新最后修改時(shí)間。
此處實(shí)現(xiàn)自動(dòng)填充創(chuàng)建人、修改人
創(chuàng)建時(shí)間、修改時(shí)間等交給MySQL
進(jìn)行自動(dòng)填充
MetaObjectHandler 提供了以下核心方法:
- void insertFill(MetaObject metaObject): 處理插入時(shí)的字段自動(dòng)填充。
- void updateFill(MetaObject metaObject): 處理更新時(shí)的字段自動(dòng)填充。
- MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject): 用于設(shè)置指定字段的值。
- Object getFieldValByName(String fieldName, MetaObject metaObject): 獲取指定字段的值。
- TableInfo findTableInfo(MetaObject metaObject): 根據(jù) MetaObject 獲取對(duì)應(yīng)的表信息。
默認(rèn)實(shí)現(xiàn)
MyBatis-Plus 提供了 MetaObjectHandler 的默認(rèn)實(shí)現(xiàn)類(lèi)。開(kāi)發(fā)者可以通過(guò)繼承該類(lèi),來(lái)定制插入和更新時(shí)的字段填充邏輯。
嚴(yán)格填充策略
默認(rèn)情況下,MetaObjectHandler 遵循嚴(yán)格填充策略,這意味著在字段已有值的情況下不會(huì)覆蓋該值,而是在字段為空時(shí)才進(jìn)行填充。這種策略保證了數(shù)據(jù)的一致性,并防止不必要的覆蓋。
使用
實(shí)現(xiàn) MetaObjectHandler
接口:
首先需要?jiǎng)?chuàng)建一個(gè)類(lèi)實(shí)現(xiàn) MetaObjectHandler
接口,并重寫(xiě)其中的方法。
package com.zk.app.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.zk.app.utils.UserThreadLocalUtil; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; /** * @program: ZK * @description: 自定義mubatisplust填充 * @author: zk * @create: 2024-07-17 11:30 **/ @Component public class ZKMetaObjectHandler implements MetaObjectHandler { /** * 創(chuàng)建人字段 */ private static final String CREATE_USER_ID = "createUserId"; /** * 修改人字段 */ private static final String UPDATE_USER_ID = "updateUserId"; @Override public void insertFill(MetaObject metaObject) { this.setUserId(metaObject, true); } @Override public void updateFill(MetaObject metaObject) { this.setUserId(metaObject, false); } private void setUserId(MetaObject metaObject, boolean isInsert) { Long userId = UserThreadLocalUtil.getUserId(); if (userId > 0) { if (isInsert) { this.setFieldValByName(CREATE_USER_ID, userId, metaObject); } this.setFieldValByName(UPDATE_USER_ID, userId, metaObject); } } }
通過(guò)insertFill與updateFill在新增/更新時(shí)進(jìn)行自動(dòng)填充
UserThreadLocalUtil為T(mén)hreadLocal,主要為存儲(chǔ)當(dāng)前線程的用戶(hù)信息
到此這篇關(guān)于Mybatis-Plus中的MetaObjectHandler組件的使用的文章就介紹到這了,更多相關(guān)Mybatis-Plus MetaObjectHandler 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot JPA中使用@Entity和@Table的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot JPA中使用@Entity和@Table的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Springboot的自動(dòng)配置是什么及注意事項(xiàng)
SpringBoot的自動(dòng)配置(Auto-configuration)是指框架根據(jù)項(xiàng)目的依賴(lài)和應(yīng)用程序的環(huán)境自動(dòng)配置Spring應(yīng)用上下文中的Bean和組件,目的是簡(jiǎn)化開(kāi)發(fā)者的配置工作,本文介紹Springboot的自動(dòng)配置是什么及注意事項(xiàng),感興趣的朋友一起看看吧2025-03-03Java設(shè)計(jì)模式之橋模式(Bridge模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之橋模式(Bridge模式)介紹,本文講解了為什么使用橋模式、如何實(shí)現(xiàn)橋模式、Bridge模式在EJB中的應(yīng)用等內(nèi)容,需要的朋友可以參考下2015-03-03java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實(shí)例
這篇文章主要介紹了java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08swagger注解@ApiModelProperty失效情況的解決
這篇文章主要介紹了swagger注解@ApiModelProperty失效情況的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06java獲取文件的inode標(biāo)識(shí)符的方法
這篇文章主要介紹了java獲取文件的inode標(biāo)識(shí)符,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04spring-boot-klock-starter V1.1 主體功能重大更新內(nèi)容介紹
這篇文章主要介紹了spring-boot-klock-starter V1.1 主體功能重大更新內(nèi)容描述,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01