Mybatis-Plus中的MetaObjectHandler組件的使用
簡介
MetaObjectHandler 是一個非常有用的組件,用于處理實體對象中的字段填充邏輯,比如自動填充創(chuàng)建時間、更新時間、創(chuàng)建人、修改人等字段。
設(shè)計理念
在現(xiàn)代應用程序中,數(shù)據(jù)庫記錄的維護常常涉及到類似于“創(chuàng)建時間”、“更新時間”等公共字段。如果在每次插入或更新操作中都手動處理這些字段,不僅容易出錯,還增加了代碼的冗余。MetaObjectHandler 的設(shè)計初衷正是為了簡化這一過程,使得這些公共字段的處理變得自動化和無感知。
自動填充的優(yōu)勢
自動填充不僅減少了代碼的冗余,還提高了數(shù)據(jù)的一致性和完整性。通過自動填充,開發(fā)者可以確保每次數(shù)據(jù)庫操作都遵循相同的規(guī)則,避免了人為錯誤。此外,自動填充還可以提高開發(fā)效率,使開發(fā)者能夠?qū)W⒂跇I(yè)務邏輯的實現(xiàn)。
組件介紹
MetaObjectHandler 接口允許在不修改業(yè)務代碼的情況下,對實體類中的字段進行自動填充。這通常用于記錄創(chuàng)建時間、更新時間、創(chuàng)建人、修改人等元數(shù)據(jù)信息。例如,在用戶注冊時自動設(shè)置創(chuàng)建時間,在更新用戶信息時自動更新最后修改時間。
此處實現(xiàn)自動填充創(chuàng)建人、修改人
創(chuàng)建時間、修改時間等交給MySQL進行自動填充
MetaObjectHandler 提供了以下核心方法:
- void insertFill(MetaObject metaObject): 處理插入時的字段自動填充。
- void updateFill(MetaObject metaObject): 處理更新時的字段自動填充。
- MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject): 用于設(shè)置指定字段的值。
- Object getFieldValByName(String fieldName, MetaObject metaObject): 獲取指定字段的值。
- TableInfo findTableInfo(MetaObject metaObject): 根據(jù) MetaObject 獲取對應的表信息。
默認實現(xiàn)
MyBatis-Plus 提供了 MetaObjectHandler 的默認實現(xiàn)類。開發(fā)者可以通過繼承該類,來定制插入和更新時的字段填充邏輯。
嚴格填充策略
默認情況下,MetaObjectHandler 遵循嚴格填充策略,這意味著在字段已有值的情況下不會覆蓋該值,而是在字段為空時才進行填充。這種策略保證了數(shù)據(jù)的一致性,并防止不必要的覆蓋。
使用
實現(xiàn) MetaObjectHandler 接口:
首先需要創(chuàng)建一個類實現(xiàn) MetaObjectHandler 接口,并重寫其中的方法。
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);
}
}
}
通過insertFill與updateFill在新增/更新時進行自動填充
UserThreadLocalUtil為ThreadLocal,主要為存儲當前線程的用戶信息
到此這篇關(guān)于Mybatis-Plus中的MetaObjectHandler組件的使用的文章就介紹到這了,更多相關(guān)Mybatis-Plus MetaObjectHandler 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot JPA中使用@Entity和@Table的實現(xiàn)
這篇文章主要介紹了Spring Boot JPA中使用@Entity和@Table的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例
這篇文章主要介紹了java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例的相關(guān)資料,希望通過本文能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
swagger注解@ApiModelProperty失效情況的解決
這篇文章主要介紹了swagger注解@ApiModelProperty失效情況的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
spring-boot-klock-starter V1.1 主體功能重大更新內(nèi)容介紹
這篇文章主要介紹了spring-boot-klock-starter V1.1 主體功能重大更新內(nèi)容描述,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-01-01

