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

Mybatis-Plus 自動填充失效問題解決

 更新時間:2024年10月23日 11:06:09   作者:Excellent的崽子  
在使用MyBatis-Plus時,自動填充功能可能會失效,這通常與版本和配置有關(guān),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

確認版本

首先確認你的項目中使用的 mybatis-plus 版本是 3.3.0 以下還是 3.3.0 以上(包含 3.3.0),在低版本和高版本中重寫 MetaObjectHandler 方法的 insertFill 和 updateFill 的寫法是不同的,比如下面示例:

@Bean
public MetaObjectHandler metaObjectHandler(){

    return new MetaObjectHandler() {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createdDate", new Date(), metaObject);
            this.setFieldValByName("updatedDate", new Date(), metaObject);
        }
            @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updatedDate", new Date(), metaObject);
        }
    };
}

這是使用 MyBatis-Plus 早期版本(在 3.3.0 之前)的自定義 MetaObjectHandler 實現(xiàn)。它使用 setFieldValByName 方法來設置 createdDate 和 updatedDate 字段的值。這種方法使用的是 java.util.Date 類型。

    @Bean
    public MetaObjectHandler metaObjectHandler(){
        return new MetaObjectHandler() {
            @Override
            public void insertFill(MetaObject metaObject) {
                this.strictInsertFill(metaObject, "createdDate", Date.class, new Date());
                this.strictInsertFill(metaObject, "updatedDate", Date.class, new Date());
            }

            @Override
            public void updateFill(MetaObject metaObject) {
                this.strictUpdateFill(metaObject, "updatedDate",  LocalDateTime.class, LocalDateTime.now());
            }
        };
    }

這是使用 MyBatis-Plus 3.3.0 及以上版本中引入的更高級的填充策略。它使用 strictInsertFill 和 strictUpdateFill 方法,這些方法更加類型安全,也提供了更靈活的填充選項。此版本推薦使用 java.time.LocalDateTime 類型,這符合 Java 8 及更高版本中引入的時間 API,提供了更好的日期和時間處理能力。
詳細對比:

類型安全性

第二種寫法中,strictInsertFill 和 strictUpdateFill 方法允許你指定目標字段的數(shù)據(jù)類型(例如 LocalDateTime.class),從而避免了類型轉(zhuǎn)換錯誤。

第一種寫法中,setFieldValByName 方法需要你自己確保字段類型和賦值類型的一致性。

默認值提供方式

第二種寫法中,你可以直接傳遞一個 LocalDateTime.now() 表達式,或者使用 lambda 表達式 () -> LocalDateTime.now() 來提供一個延遲執(zhí)行的默認值。這在某些情況下可能更有用,比如當你的默認值依賴于一些業(yè)務邏輯時。

第一種寫法直接使用 new Date() 創(chuàng)建日期實例,沒有提供延遲執(zhí)行的機制。

兼容性和 bug 修復

第二種寫法是 MyBatis-Plus 推薦的最新實踐,通常意味著它有更好的兼容性和已知問題的修復。

第一種寫法可能在新版本中不再得到支持,或存在未解決的 bug,例如 fillStrategy 方法在 3.3.0 版本中有 bug。

檢查配置

首先是引入高版本的 pom 依賴:

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.3.0</version>
</dependency>

編寫mybatis-plus的配置類

/**
 * MyBatis-Plus配置類
 */
@MapperScan("com.demo.mapper") // 定義項目中的 mapper 路徑
@Configuration
public class MybatisPlusConfig {

    /**
     * mybatis-plus 自動填充配置
     */
    @Bean
    public MetaObjectHandler metaObjectHandler(){
        return new MetaObjectHandler() {
            @Override
            public void insertFill(MetaObject metaObject) {
                /**
                  * 第一個參數(shù) metaObject 這里面包含了你傳入的實體類
                  * 第二個參數(shù)要和實體類中的屬性名保持一致
                  * 第三個參數(shù)要跟實體類中的屬性類型保持一致
                  * 第四個參數(shù)是你設置的填充默認值
                  */      
                this.strictInsertFill(metaObject, "createdDate", Date.class, new Date());
                this.strictInsertFill(metaObject, "updatedDate", Date.class, new Date());
            }

            @Override
            public void updateFill(MetaObject metaObject) {
                this.strictUpdateFill(metaObject, "updatedDate",  Date.class, new Date());
            }
        };
    }

}

在實體類中,你需要使用 @TableField 注解來標記哪些字段需要自動填充,并指定填充的策略。

public class User {
    @TableField(fill = FieldFill.INSERT)
    private String createTime;

    @TableField(fill = FieldFill.UPDATE)
    private String updateTime;

    // 其他字段...
}

delete 和 update 方法的區(qū)別

在 MyBatis-Plus 中,`delete` 方法和 `update` 方法的行為差異主要源于它們對 `MetaObjectHandler` 中定義的自動填充邏輯的調(diào)用時機和方式的不同。

對于 update方法:

當你使用 update 方法時,MyBatis-Plus 會調(diào)用 MetaObjectHandler 的 updateFill 方法。這是因為 update 方法本質(zhì)上是一個更新操作,它會觸發(fā)自動填充邏輯,尤其是那些被標記為 FieldFill.UPDATE 或 FieldFill.INSERT_UPDATE 的字段。

對于 delete 方法:

當使用 delete 方法時,情況就有所不同了。默認情況下,delete 方法不會觸發(fā) MetaObjectHandler 的 updateFill 方法,即使你正在使用邏輯刪除(即,delete 方法實際上執(zhí)行的是一個 UPDATE 語句來修改一個邏輯刪除標志)。這是因為在 MyBatis-Plus 的設計中,delete 方法的目的就是刪除記錄,無論是物理刪除還是邏輯刪除,它都不會觸發(fā)更新字段的自動填充邏輯。

然而,當你在實體類中使用了 @TableLogic 注解并配置了邏輯刪除,MyBatis-Plus 的 delete 方法會執(zhí)行一個 UPDATE 語句來改變邏輯刪除字段的值,但它不會執(zhí)行 updateFill 方法來更新其他字段,如 updatedDate。這是 MyBatis-Plus 的設計決策,它將 delete 和 update 視為不同的操作,即使在邏輯刪除的情況下,delete 方法也不會觸發(fā)常規(guī)的更新字段填充。

注意事項

  • 如果你手動的設置了自動填充的值,那么 MyBatis-Plus 的自動填充策略不會覆蓋這個值。
  • 字段必須聲明 @TableField 注解,并設置 fill 屬性來選擇填充策略。
  • 填充處理器需要在 Spring Boot 中聲明為 @Component 或 @Bean。
  • 在 update(T entity, Wrapper<T> updateWrapper) 時,entity 不能為空,否則自動填充失效。
  • 在 update(Wrapper<T> updateWrapper) 時不會自動填充,需要手動賦值字段條件。

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

相關(guān)文章

  • 如何使用Idea中的 Deployment 實現(xiàn)打包自動部署

    如何使用Idea中的 Deployment 實現(xiàn)打包自動部署

    這篇文章主要介紹了使用Idea中的 Deployment 實現(xiàn)打包自動部署,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java8 Supplier接口和Consumer接口原理解析

    Java8 Supplier接口和Consumer接口原理解析

    這篇文章主要介紹了Java8 Supplier接口和Consumer接口原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • mybatis-plus只查詢部分字段的三種實現(xiàn)方式

    mybatis-plus只查詢部分字段的三種實現(xiàn)方式

    文章介紹了三種使用queryWrapper的select()方法查詢數(shù)據(jù)庫時指定要查詢的字段的方法,方法1查詢name和phone字段,其他字段值為null;方法2查詢除age和address外的其他字段,這兩個字段值為null;方法3使用selectMaps方法
    2025-11-11
  • Spring中EnvironmentAware 接口的使用小結(jié)

    Spring中EnvironmentAware 接口的使用小結(jié)

    EnvironmentAware 是 Spring 框架中的一個 Aware 回調(diào)接口,本文就來詳細的介紹一下Spring中EnvironmentAware 接口的使用小結(jié),感興趣的可以了解一下
    2026-04-04
  • Java協(xié)程編程之Loom

    Java協(xié)程編程之Loom

    這篇文章主要介紹了Java協(xié)程編程Loom的方法,需要的朋友請看下文
    2021-08-08
  • 全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因

    全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因

    這篇文章主要介紹了全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringBoot手把手實現(xiàn)生成PDF功能的示例代碼

    SpringBoot手把手實現(xiàn)生成PDF功能的示例代碼

    這篇文章主要介紹了如何使用Thymeleaf模板和iText庫配合Flying-pdf工具,實現(xiàn)在業(yè)務系統(tǒng)中生成PDF文件的功能,感興趣的小伙伴可以了解下
    2025-12-12
  • MyBatis?連接緩慢問題排查與解決實戰(zhàn)技巧

    MyBatis?連接緩慢問題排查與解決實戰(zhàn)技巧

    文章介紹了在維護一個老項目時遇到的MyBatis連接緩慢問題的排查過程和解決方案,本文分階段給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • springboot將mybatis升級為mybatis-plus的實現(xiàn)

    springboot將mybatis升級為mybatis-plus的實現(xiàn)

    之前項目工程用的是mybatis,現(xiàn)在需要將其替換為mybatis-plus,本文主要介紹了springboot將mybatis升級為mybatis-plus的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • SpringBoot可視化接口開發(fā)工具magic-api的簡單使用教程

    SpringBoot可視化接口開發(fā)工具magic-api的簡單使用教程

    作為Java后端開發(fā),平時開發(fā)API接口的時候經(jīng)常需要定義Controller、Service、Dao、Mapper、XML、VO等Java對象。有沒有什么辦法可以讓我們不寫這些代碼,直接操作數(shù)據(jù)庫生成API接口呢?今天給大家推薦一款工具magic-api,來幫我們實現(xiàn)這個小目標!
    2021-06-06

最新評論

鄂伦春自治旗| 盐池县| 龙泉市| 双城市| 聂拉木县| 罗源县| 迁安市| 开封县| 沾益县| 睢宁县| 崇左市| 富裕县| 安化县| 武安市| 高平市| 靖江市| 含山县| 巴南区| 株洲市| 鄢陵县| 闵行区| 青冈县| 勃利县| 射阳县| 银川市| 宝兴县| 沙洋县| 逊克县| 台南市| 秀山| 左云县| 库尔勒市| 离岛区| 巴里| 长治市| 应用必备| 青川县| 都昌县| 高碑店市| 阿合奇县| 孟州市|