最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決mybatisplus MetaObjectHandler 失效的問(wèn)題

 更新時(shí)間:2023年02月05日 10:53:51   作者:lilun1231  
本文主要介紹了解決mybatisplus MetaObjectHandler 失效的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、什么是metaObjectHandler

MetaObjectHandler接口是mybatisPlus為我們提供的的一個(gè)擴(kuò)展接口,我們可以利用這個(gè)接口在我們插入或者更新數(shù)據(jù)的時(shí)候,為一些字段指定默認(rèn)值
使用方式如下:

1、在實(shí)體類(lèi)上加入@TableField注解

@Getter
@Setter
public class AbstractBaseDO<T extends Model<T>> extends Model<T> implements Serializable {

? ? /**
? ? ?* 創(chuàng)建時(shí)間 新增時(shí)填充
? ? ?*/
? ? @TableField(fill = FieldFill.INSERT)
? ? private Date gmtCreate;

? ? /**
? ? ?* 修改時(shí)間 新增和更新時(shí)填充
? ? ?*/
? ? @TableField(fill = FieldFill.INSERT_UPDATE)
? ? private Date gmtModified;

? ? /**
? ? ?* 創(chuàng)建人ID 新增時(shí)更新
? ? ?*/
? ? @TableField(fill = FieldFill.INSERT)
? ? private Long creatorId;

? ? /**
? ? ?* 修改人ID 新增和更新時(shí)填充
? ? ?*/
? ? @TableField(fill = FieldFill.INSERT_UPDATE)
? ? private Long modifierId;

? ? /**
? ? ?* 邏輯刪除字段 新增和更新時(shí)填充
? ? ?*/
? ? @TableField(fill = FieldFill.INSERT_UPDATE)
? ? private Integer isDeleted;

? ? @Override
? ? public String toString() {
? ? ? ? return new ToStringBuilder(this)
? ? ? ? ? ? .append("gmtCreate", gmtCreate)
? ? ? ? ? ? .append("gmtModified", gmtModified)
? ? ? ? ? ? .append("creatorId", creatorId)
? ? ? ? ? ? .append("modifierId", modifierId)
? ? ? ? ? ? .append("isDeleted", isDeleted)
? ? ? ? ? ? .toString();
? ? }
}

2、創(chuàng)建配置類(lèi)實(shí)現(xiàn)MetaObjectHandler接口

@Slf4j
@Configuration
public class MetaObjectHandlerConfig implements MetaObjectHandler {
?? ?
?? ?/**
?? ?*插入時(shí)自動(dòng)填充
?? ?*/
? ? @Override
? ? public void insertFill(MetaObject metaObject) {
? ? ? ? //獲得用戶上下文
? ? ? ? UserContext dscUser = GlobalSessionContext.getDscUser();
? ? ? ? //獲得當(dāng)前時(shí)間
? ? ? ? Date date = Calendar.getInstance().getTime();

? ? ? ? //創(chuàng)建時(shí)間
? ? ? ? this.fillStrategy(metaObject, "gmtCreate", date);
? ? ? ? //更新時(shí)間
? ? ? ? this.fillStrategy(metaObject, "gmtModified", date);
? ? ? ? //未刪除
? ? ? ? this.fillStrategy(metaObject, "isDeleted", CommonConstants.NON_DELETED);
? ? ? ? //創(chuàng)建者
? ? ? ? this.fillStrategy(metaObject, "creatorId", dscUser.getUserId());
? ? ? ? //更新者
? ? ? ? this.fillStrategy(metaObject, "modifierId", dscUser.getUserId());

? ? }
? ??
?? ?/**
?? ?*修改時(shí)自動(dòng)填充
?? ?*/
? ? @Override
? ? public void updateFill(MetaObject metaObject) {
? ? ? ? //獲得用戶上下文
? ? ? ? UserContext dscUser = GlobalSessionContext.getDscUser();
? ? ? ? //獲得當(dāng)前時(shí)間
? ? ? ? Date date = Calendar.getInstance().getTime();
? ? ? ? //強(qiáng)制更新時(shí)間
? ? ? ? this.setFieldValByName("gmtModified", date, metaObject);
? ? ? ? //更新者
? ? ? ? this.fillStrategy(metaObject, "modifierId",dscUser.getUserId());

? ? }
}

二、失效場(chǎng)景及解決方案

1、使用mybatis-plus的boolean update(Wrapper updateWrapper)鏈?zhǔn)礁路椒〞r(shí)失效

1)示例代碼

/**
*更新屬性
*/
?@Override
? ? public Boolean expireHistoryTask(Long tenantId, Long produceInfoId) {
? ? ? ? return this.update(new UpdateWrapper<TaskDetailInfoDO>().lambda()
? ? ? ? ? ? .eq(TaskDetailInfoDO::getTenantId, tenantId)
? ? ? ? ? ? .in(TaskDetailInfoDO::getProduceInfoId, produceInfoId)
? ? ? ? ? ? .eq(TaskDetailInfoDO::getIsDeleted, CommonConstants.NON_DELETED)
? ? ? ? ? ? .set(TaskDetailInfoDO::getTaskStatus, TaskStatusEnum.EXPIRED.getCode())
? ? ? ? ? ??
? ? }

2)失效原因

這種更新方法失效我們需要去看mbatis-plus的源碼

   private static void process(MappedStatement ms, Object parameterObject) {
        if (parameterObject != null) {
            TableInfo tableInfo = null;
            Object entity = parameterObject;
            if (parameterObject instanceof Map) {
                Map<?, ?> map = (Map<?, ?>) parameterObject;
                if (map.containsKey(Constants.ENTITY)) {
                    Object et = map.get(Constants.ENTITY);
                    if (et != null) {
                        entity = et;
                        tableInfo = TableInfoHelper.getTableInfo(entity.getClass());
                    }
                }
            } else {
                tableInfo = TableInfoHelper.getTableInfo(parameterObject.getClass());
            }
            //tableInfo為空,則不自動(dòng)填充
            if (tableInfo != null) {
                //到這里就應(yīng)該轉(zhuǎn)換到實(shí)體參數(shù)對(duì)象了,因?yàn)樘畛浜虸D處理都是爭(zhēng)對(duì)實(shí)體對(duì)象處理的,不用傳遞原參數(shù)對(duì)象下去.
                MetaObject metaObject = ms.getConfiguration().newMetaObject(entity);
                if (SqlCommandType.INSERT == ms.getSqlCommandType()) {
                    populateKeys(tableInfo, metaObject, entity);
                    insertFill(metaObject, tableInfo);
                } else {
                    updateFill(metaObject, tableInfo);
                }
            }
        }
    }

從上面的代碼可以看出,當(dāng)tableInfo為空,則不自動(dòng)填充字段值。而繼續(xù)看,tableInfo是從parameterObject中獲取,而這parameterObject就是要更新的實(shí)體對(duì)象。
在看我們使用 update(Wrapper updateWrapper)更新的底層邏輯

 /**
     * 根據(jù) UpdateWrapper 條件,更新記錄 需要設(shè)置sqlset
     *
     * @param updateWrapper 實(shí)體對(duì)象封裝操作類(lèi) {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    default boolean update(Wrapper<T> updateWrapper) {
        //傳入了一個(gè)空實(shí)體
        return update(null, updateWrapper);
    }

此時(shí)是傳了一個(gè)空對(duì)象,這就導(dǎo)致了整個(gè)后續(xù)的填充都失效了。

3)解決方法

使用update的另一個(gè)方法

在更新是傳入實(shí)體對(duì)象

  @Override
    public Boolean expireHistoryTask(Long tenantId, Long produceInfoId) {
        return this.update(new TaskDetailInfoDO(), new UpdateWrapper<TaskDetailInfoDO>().lambda()
            .eq(TaskDetailInfoDO::getTenantId, tenantId)
            .in(TaskDetailInfoDO::getProduceInfoId, produceInfoId)
            .eq(TaskDetailInfoDO::getIsDeleted, CommonConstants.NON_DELETED)
            .set(TaskDetailInfoDO::getTaskStatus, TaskStatusEnum.EXPIRED.getCode())
        );
    }

2、填充時(shí)使用 MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) 方法

 @Override
    public void updateFill(MetaObject metaObject) {
        //獲得用戶上下文
        UserContext dscUser = GlobalSessionContext.getDscUser();
        //更新者
        this.fillStrategy(metaObject, "modifierId", dscUser.getUserId());
    }

fillStartegy的源碼時(shí)這樣的

    /**
     * 填充策略,默認(rèn)有值不覆蓋,如果提供的值為null也不填充
     *
     * @param metaObject metaObject meta object parameter
     * @param fieldName  java bean property name
     * @param fieldVal   java bean property value of Supplier
     * @since 3.3.0
     */
    default MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {
        if (getFieldValByName(fieldName, metaObject) == null) {
            setFieldValByName(fieldName, fieldVal, metaObject);
        }
        return this;
    }

當(dāng)需要更新的字段已經(jīng)有值時(shí),則默認(rèn)不更新。需要強(qiáng)制更新字段時(shí),使用 MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) 方法更新字段值。

   @Override
    public void updateFill(MetaObject metaObject) {
        //獲得用戶上下文
        UserContext dscUser = GlobalSessionContext.getDscUser();
        //獲得當(dāng)前時(shí)間
        Date date = Calendar.getInstance().getTime();
        //更新時(shí)間
        this.setFieldValByName("gmtModified", date, metaObject);
        //更新者
        this.setFieldValByName("modifierId", metaObject, dscUser.getUserId());
    }

到此這篇關(guān)于解決mybatisplus MetaObjectHandler 失效的問(wèn)題的文章就介紹到這了,更多相關(guān)mybatisplus MetaObjectHandler 失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Tomcat連接池的使用

    SpringBoot整合Tomcat連接池的使用

    這篇文章主要介紹了SpringBoot整合Tomcat連接池的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java獲取圖片的大小、寬度、高度方式

    java獲取圖片的大小、寬度、高度方式

    文章介紹了如何將File對(duì)象轉(zhuǎn)換為MultipartFile對(duì)象的過(guò)程,并分享了個(gè)人經(jīng)驗(yàn),希望能為讀者提供參考
    2025-02-02
  • java如何實(shí)現(xiàn)項(xiàng)目啟動(dòng)時(shí)執(zhí)行指定方法

    java如何實(shí)現(xiàn)項(xiàng)目啟動(dòng)時(shí)執(zhí)行指定方法

    這篇文章主要為大家詳細(xì)介紹了java項(xiàng)目如何啟動(dòng)時(shí)執(zhí)行指定方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • java?BigDecimal類(lèi)案例詳解

    java?BigDecimal類(lèi)案例詳解

    這篇文章主要介紹了java?BigDecimal類(lèi)案例詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-08-08
  • hibernate查詢緩存詳細(xì)分析

    hibernate查詢緩存詳細(xì)分析

    這篇文章主要介紹了hibernate查詢緩存詳細(xì)分析,包括查詢緩存配置方法及關(guān)閉二級(jí)緩存的詳細(xì)介紹,需要的朋友參考下本文吧
    2017-09-09
  • 深入淺析Java中Static Class及靜態(tài)內(nèi)部類(lèi)和非靜態(tài)內(nèi)部類(lèi)的不同

    深入淺析Java中Static Class及靜態(tài)內(nèi)部類(lèi)和非靜態(tài)內(nèi)部類(lèi)的不同

    上次有朋友問(wèn)我,java中的類(lèi)可以是static嗎?我給他肯定的回答是可以的,在java中我們可以有靜態(tài)實(shí)例變量、靜態(tài)方法、靜態(tài)塊。當(dāng)然類(lèi)也可以是靜態(tài)的,下面小編整理了些關(guān)于java中的static class相關(guān)資料分享在腳本之家平臺(tái)供大家參考
    2015-11-11
  • java格式化時(shí)間示例

    java格式化時(shí)間示例

    這篇文章主要介紹了java格式化時(shí)間示例,需要的朋友可以參考下
    2014-04-04
  • MyBatis寫(xiě)入Json字段以及Json字段轉(zhuǎn)對(duì)象示例詳解

    MyBatis寫(xiě)入Json字段以及Json字段轉(zhuǎn)對(duì)象示例詳解

    這篇文章主要給大家介紹了關(guān)于MyBatis寫(xiě)入Json字段以及Json字段轉(zhuǎn)對(duì)象的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • SpringMVC配置與使用詳細(xì)介紹

    SpringMVC配置與使用詳細(xì)介紹

    Spring MVC是一個(gè)基于Java的實(shí)現(xiàn)了MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類(lèi)型的輕量級(jí)Web框架,通過(guò)把Model,View,Controller分離,將web層進(jìn)行職責(zé)解耦,把復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,簡(jiǎn)化開(kāi)發(fā),減少出錯(cuò),方便組內(nèi)配合
    2022-07-07
  • Mybatis注解開(kāi)發(fā)單表、多表操作的實(shí)現(xiàn)代碼

    Mybatis注解開(kāi)發(fā)單表、多表操作的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Mybatis高級(jí):Mybatis注解開(kāi)發(fā)單表操作,Mybatis注解開(kāi)發(fā)多表操作,構(gòu)建sql語(yǔ)句,綜合案例學(xué)生管理系統(tǒng)使用接口注解方式優(yōu)化,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

宁明县| 柳林县| 张掖市| 元朗区| 孟津县| 响水县| 木兰县| 静海县| 吉水县| 长沙县| 闻喜县| 安宁市| 山东省| 隆德县| 文水县| 明溪县| 保康县| 佳木斯市| 兴文县| 望谟县| 民乐县| 东丽区| 开阳县| 揭西县| 开平市| 灯塔市| 英吉沙县| 汨罗市| 昭平县| 新和县| 新蔡县| 中山市| 林芝县| 泰宁县| 金堂县| 顺义区| 旅游| 通化市| 黔西县| 南投市| 井陉县|