Mybatis-Plus中的MetaObjectHandler

丿似锦發表於2024-08-24

簡介

MetaObjectHandler 是一個非常有用的元件,用於處理實體物件中的欄位填充邏輯,比如自動填充建立時間、更新時間、建立人、修改人等欄位。

元件介紹

MetaObjectHandler 介面允許在不修改業務程式碼的情況下,對實體類中的欄位進行自動填充。這通常用於記錄建立時間、更新時間、建立人、修改人等後設資料資訊。例如,在使用者註冊時自動設定建立時間,在更新使用者資訊時自動更新最後修改時間。

此處實現自動填充建立人、修改人
建立時間、修改時間等交給MySQL進行自動填充

使用

  • 實現 MetaObjectHandler 介面:
    首先需要建立一個類實現 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 {
    /**
     * 建立人欄位
     */
    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);
        }
    }
}

透過insertFillupdateFill在新增/更新時進行自動填充
UserThreadLocalUtilThreadLocal,主要為儲存當前執行緒的使用者資訊


結束

相關文章