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

MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案(最新整理)

 更新時間:2025年06月11日 15:17:56   作者:代碼怪獸大作戰(zhàn)  
在使用MyBatis Plus時,通常我們會在數(shù)據(jù)庫表中設(shè)置create_time和update_time兩個字段,借助 MyBatis Plus 的自動填充功能來維護這些時間字段,下面通過本文介紹MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案,感興趣的朋友一起看看吧

前言

在使用 MyBatis Plus 時,通常我們會在數(shù)據(jù)庫表中設(shè)置 create_timeupdate_time 兩個字段,借助 MyBatis Plus 的 自動填充功能 來維護這些時間字段。

但是,有時候你可能會遇到 update_time 字段未自動更新的情況,哪怕代碼中已經(jīng)配置了 MetaObjectHandler。本文將針對這一問題,分析可能的原因,并提供詳細的解決方案。

一、問題現(xiàn)象

假設(shè)我們有如下的 updateFill() 方法:

@Override
public void updateFill(MetaObject metaObject) {
	log.info("執(zhí)行更新填充...");
    this.strictInsertFill(metaObject, "updateTime", Timestamp.class, Timestamp.valueOf(LocalDateTime.now())); 
    this.strictInsertFill(metaObject, "updateBy", BigInteger.class, userId); 
}

但是執(zhí)行更新操作后:

  • 數(shù)據(jù)庫中的 update_time 字段未更新
  • 沒有報錯,但 updateTime 依然是舊值
  • updateBy 可能也未更新

接下來我們來分析可能的原因。

二、原因分析

1. 使用了 strictInsertFill/strictUpdateFill 導(dǎo)致更新失效

原因:

strictInsertFill/strictUpdateFill 主要用于插入數(shù)據(jù)時的自動填充。即使在 updateFill() 中使用它,也不會生效。

原理解釋:

strictInsertFill/strictUpdateFill 的作用是 如果字段已有值則不會覆蓋,而在更新場景中,一般實體對象中 update_time 已有值。

解決方案:

strictInsertFill/strictUpdateFill 替換為 setFieldValByName

@Override
public void updateFill(MetaObject metaObject) {
    log.info("start update fill ....");
    this.setFieldValByName("updateTime", Timestamp.valueOf(LocalDateTime.now()), metaObject);
    this.setFieldValByName("updateBy", userId, metaObject);
}

原因分析補充:

  • strictInsertFill/strictUpdateFill插入/更新數(shù)據(jù)時填充,不適用于更新場景。
  • setFieldValByName → 更新數(shù)據(jù)時直接覆蓋字段值,即使原值存在。

2. 實體類注解配置錯誤

原因:

實體類中的字段沒有正確標(biāo)注 @TableField(fill = FieldFill.INSERT_UPDATE),導(dǎo)致自動填充機制無法生效。

解決方案:

在實體類中正確設(shè)置注解:

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private BigInteger updateBy;
}

注意:

  • FieldFill.INSERT_UPDATE:用于插入和更新時自動填充。
  • 如果沒有加上這個注解,MyBatis Plus 不會執(zhí)行自動填充邏輯。

3. MetaObjectHandler 未生效

原因:

MetaObjectHandler 需要被 Spring 管理。如果沒有加上 @Component 注解或沒有被掃描到,自動填充方法不會執(zhí)行。

解決方案:

確保 FieldAutoFillHandler 類上有 @Component 注解:

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class FieldAutoFillHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("執(zhí)行插入填充...");
        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("執(zhí)行更新填充...");
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}

注意:

如果項目中有多個 MetaObjectHandler,需要確保不會有沖突。

4. 使用自定義 SQL 導(dǎo)致自動填充失效

原因:

如果你在 Mapper.xml 中自定義了 update 語句,那么 MyBatis Plus 不會觸發(fā)自動填充邏輯。

解決方案:

方法 1:在 XML 中手動設(shè)置 update_time 字段:

<update id="updateUser" parameterType="com.example.entity.User">
    UPDATE user
    SET name = #{name},
        update_time = NOW(),
        update_by = #{updateBy}
    WHERE id = #{id}
</update>

方法 2:直接使用 BaseMapper 提供的 updateById() 等方法,MyBatis Plus 會自動觸發(fā)填充:

User user = userMapper.selectById(1L);
user.setName("李四");
userMapper.updateById(user);

5. 字段類型不匹配

原因:

數(shù)據(jù)庫中 update_time 的數(shù)據(jù)類型與 Java 實體類的類型不匹配,導(dǎo)致填充失敗。

解決方案:

確保數(shù)據(jù)庫字段類型和實體類一致:

ALTER TABLE user
MODIFY update_time TIMESTAMP NULL DEFAULT NULL;
private LocalDateTime updateTime;

注意:

  • 使用 LocalDateTime 處理時間字段是最佳實踐。
  • 如果數(shù)據(jù)庫字段為 datetimetimestamp,不要使用 String 類型。

三、總結(jié):常見原因與解決方法對照表

原因現(xiàn)象解決方法
使用了 strictInsertFillupdate_time 未更新使用 setFieldValByName 替代
實體類注解錯誤自動填充無效確保字段上加了 @TableField(fill = FieldFill.INSERT_UPDATE)
MetaObjectHandler 未生效updateFill() 不執(zhí)行確保加上 @Component 注解
使用自定義 SQL 覆蓋了默認(rèn)方法填充邏輯未觸發(fā)使用 BaseMapper.updateById() 或在 SQL 中手動填充
數(shù)據(jù)類型不匹配字段更新失敗數(shù)據(jù)庫字段使用 timestamp 且實體類使用 LocalDateTime

四、推薦寫法

最終推薦的 updateFill() 寫法如下:

@Override
public void updateFill(MetaObject metaObject) {
    log.info("執(zhí)行更新填充...");
    this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    this.setFieldValByName("updateBy", userId, metaObject);
}

通過這種方式,確保 update_time 字段在更新時自動更新,同時避免了不必要的填充失效問題。

到此這篇關(guān)于MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案(最新整理)的文章就介紹到這了,更多相關(guān)MyBatis Plus update_time 自動填充失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗

    SpringBoot使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗

    角色權(quán)限校驗,是保證接口安全必備的能力:有權(quán)限才可以操作,所以,一般對于這種通用邏輯,推薦不與主業(yè)務(wù)邏輯耦合,那么怎么來解耦,那么本文小編就給大家詳細講解如何使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗,需要的朋友可以參考下
    2023-07-07
  • 在IntelliJ IDEA中高效運行與調(diào)試Spring Boot項目的實戰(zhàn)步驟

    在IntelliJ IDEA中高效運行與調(diào)試Spring Boot項目的實戰(zhàn)步驟

    本章詳解SpringBoot項目導(dǎo)入IntelliJ IDEA的流程,教授運行與調(diào)試技巧,包括斷點設(shè)置與變量查看,奠定高效開發(fā)基礎(chǔ),本文給大家介紹在IntelliJ IDEA中高效運行與調(diào)試Spring Boot項目的實戰(zhàn)步驟,感興趣的朋友一起看看吧
    2025-07-07
  • Java中?equals?重寫時為什么一定也要重寫?hashCode

    Java中?equals?重寫時為什么一定也要重寫?hashCode

    這篇文章主要介紹了Java中?equals?重寫時為什么一定也要重寫?hashCode,equals?方法和?hashCode?方法是?Object?類中的兩個基礎(chǔ)方法,它們共同協(xié)作來判斷兩個對象是否相等,所以之間到底有什么聯(lián)系呢,接下來和小編一起進入文章學(xué)習(xí)該內(nèi)容吧
    2022-05-05
  • Spring Boot使用過濾器和攔截器分別實現(xiàn)REST接口簡易安全認(rèn)證示例代碼詳解

    Spring Boot使用過濾器和攔截器分別實現(xiàn)REST接口簡易安全認(rèn)證示例代碼詳解

    這篇文章主要介紹了Spring Boot使用過濾器和攔截器分別實現(xiàn)REST接口簡易安全認(rèn)證示例代碼,通過開發(fā)實踐,理解過濾器和攔截器的工作原理,需要的朋友可以參考下
    2018-06-06
  • java 優(yōu)雅關(guān)閉線程池的方案

    java 優(yōu)雅關(guān)閉線程池的方案

    這篇文章主要介紹了java 優(yōu)雅關(guān)閉線程池的方案,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot中的ThreadLocal保存請求用戶信息的實例demo

    SpringBoot中的ThreadLocal保存請求用戶信息的實例demo

    線程局部變量,創(chuàng)建一個線程變量后,針對這個變量可以讓每個線程擁有自己的變量副本,每個線程是訪問的自己的副本,與其他線程的相互獨立,本文介紹SpringBoot中的ThreadLocal保存請求用戶信息,需要的朋友可以參考下
    2024-05-05
  • Spark MLlib隨機梯度下降法概述與實例

    Spark MLlib隨機梯度下降法概述與實例

    這篇文章主要為大家詳細介紹了Spark MLlib隨機梯度下降法概述與實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java序列化原理詳解

    Java序列化原理詳解

    這篇文章主要介紹了Java序列化原理詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Spring實戰(zhàn)之使用ClassPathResource加載xml資源示例

    Spring實戰(zhàn)之使用ClassPathResource加載xml資源示例

    這篇文章主要介紹了Spring實戰(zhàn)之使用ClassPathResource加載xml資源,結(jié)合實例形式分析了Spring使用ClassPathResource加載xml資源的具體實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • java 獲取內(nèi)存使用率的流程實例詳解

    java 獲取內(nèi)存使用率的流程實例詳解

    這篇文章主要為大家介紹了java 獲取內(nèi)存使用率的流程實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論

襄城县| 米林县| 新昌县| 武定县| 惠水县| 河曲县| 焉耆| 安顺市| 简阳市| 乡城县| 云阳县| 柘城县| 宜兴市| 静乐县| 文水县| 翁源县| 渑池县| 呼和浩特市| 昆山市| 正定县| 日喀则市| 武功县| 南阳市| 昌图县| 德昌县| 南郑县| 商水县| 西乌| 茂名市| 霍城县| 广宁县| 澎湖县| 南漳县| 彭阳县| 梅河口市| 淳化县| 阿荣旗| 沈丘县| 阿拉善右旗| 南雄市| 双流县|