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