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

Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案

 更新時間:2022年05月17日 16:30:36   作者:五更依舊朝花落  
本文主要介紹了Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

昨天使用mybatis-plus。使用自動填充后發(fā)現(xiàn)了兩個問題。

  • 一個是填充數(shù)據(jù)為null,
  • 一個是當使用了mybatis-plus的樂觀鎖,自動填充就失效了

開始在網(wǎng)上看,有人說是mybatis的bug,我想不會我這么快就遇到了bug。后面我通過idea的(ctrl+B)看他的源碼.發(fā)現(xiàn)這不是bug,而是一個非常巧妙的設(shè)計,當然也可能是之前有bug,我用的版本是正常的

mybatis官網(wǎng)自動填充功能說明
我使用的版本是3.3.2

如果想省時間,前面的問題描述和分析過程不用看,直接根據(jù)目錄跳到小結(jié)就好了。

問題一:自動填充的數(shù)據(jù)為null

原因:[填充的數(shù)據(jù)類型] 和 [實體類定義的數(shù)據(jù)類型] 不一致。例如你的updateTime是 java.util.Date類型的。但是填充的是LocalDateTime(因為官網(wǎng)給個就是這個,可能就是直接用了)。這就會導致填充的數(shù)據(jù)為空。

參考如下定義

this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());

以下是官網(wǎng)給的示范:(我把那兩個過期方法去掉了)

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

? ? @Override
? ? public void insertFill(MetaObject metaObject) {
? ? ? ? log.info("start insert fill ....");
? ? ? ? this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)
? ? ? ? this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 該方法有bug請升級到之后的版本如`3.3.1.8-SNAPSHOT`)
? ? ? ? /* 上面選其一使用,下面的已過時(注意 strictInsertFill 有多個方法,詳細查看源碼) */
? ? ? ?
? ? }

? ? @Override
? ? public void updateFill(MetaObject metaObject) {
? ? ? ? log.info("start update fill ....");
? ? ? ? this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)
? ? ? ? this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 該方法有bug請升級到之后的版本如`3.3.1.8-SNAPSHOT`)
? ? ? ? /* 上面選其一使用,下面的已過時(注意 strictUpdateFill 有多個方法,詳細查看源碼) */
? ? }
}

問題二:使用mybatis-plus的樂觀鎖后發(fā)現(xiàn)自動填充的updateTime字段不自動填充了

該問題還有其他描述:從數(shù)據(jù)庫查出來的數(shù)據(jù),無法進行自動填充

本質(zhì)原因:當該字段有值之后,自動填充不進行填充,里面的數(shù)據(jù)還是原值

下面兩段代碼,testUpdateUser和testOptimisticLocker。前者updateTime進行了自動填充,后者沒有進行自動填充。

原因是后者的User對象所有字段的值都從數(shù)據(jù)庫查出來,并進行了賦值。然后自動填充數(shù)據(jù)沒有填充數(shù)據(jù)

示例:

    @Test
    public void testUpdateUser(){
        User user = new User();
        user.setId(7L);
        user.setName("喻文波");
        int rows = userMapper.updateById(user);
        System.out.println(rows);
    }
    /**
     * 測試樂觀鎖
     */
    @Test
    public void testOptimisticLocker(){
        // 先查詢一個用戶
        User user = userMapper.selectById(8L);
        System.out.println(user);
        // 修改用戶觀察version是否更新
        user.setName("pdd");
        user.setEmail("PDD@163.com");
        int rows = userMapper.updateById(user);
        System.out.println(rows);
    }

原因:

填充用的方法是:this.fillStrategy(metaObject,"updateTime",new Date());,這是官網(wǎng)提供的方法之一
我們ctrl+B進去看下

default MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {
? ? ? ? if (this.getFieldValByName(fieldName, metaObject) == null) {
? ? ? ? ? ? this.setFieldValByName(fieldName, fieldVal, metaObject);
? ? ? ? }

? ? ? ? return this;
? ? }

發(fā)現(xiàn)就是故意這樣設(shè)計的,當你要填充的字段 fieldName對應(yīng)的字段為空時才進行自動填充,否則不進行填充
然后我又看了官網(wǎng)提供的另一個方法this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
ctrl+B 看下源碼

最終調(diào)用的是下面這個。有點長。一看就不想看

然后我strict的意思,嚴格的。我推測這個應(yīng)該就是說強制執(zhí)行的意思,不管是否有原值都強制執(zhí)行更新。然后我試了下,果然就是這樣的

? ? default MetaObjectHandler strictFill(boolean insertFill, TableInfo tableInfo, MetaObject metaObject, List<StrictFill> strictFills) {
? ? ? ? if (insertFill && tableInfo.isWithInsertFill() || !insertFill && tableInfo.isWithUpdateFill()) {
? ? ? ? ? ? strictFills.forEach((i) -> {
? ? ? ? ? ? ? ? String fieldName = i.getFieldName();
? ? ? ? ? ? ? ? tableInfo.getFieldList().stream().filter((j) -> {
? ? ? ? ? ? ? ? ? ? return j.getProperty().equals(fieldName) && i.getFieldType().equals(j.getPropertyType()) && (insertFill && j.isWithInsertFill() || !insertFill && j.isWithUpdateFill());
? ? ? ? ? ? ? ? }).findFirst().ifPresent((j) -> {
? ? ? ? ? ? ? ? ? ? this.strictFillStrategy(metaObject, fieldName, i.getFieldVal());
? ? ? ? ? ? ? ? });
? ? ? ? ? ? });
? ? ? ? }

? ? ? ? return this;
? ? }

最后總結(jié):
insert也是一樣的。

? ?@Override
? ? public void updateFill(MetaObject metaObject) {
? ? ? ? // 如果有值,則不會更新
? ? ? ?// this.fillStrategy(metaObject,"updateTime",new Date());
? ? ? ? // 即使有值,也更新為當前時間
? ? ? ?this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());

? ? }

小結(jié)

填充的方法一共有三個

// 這個是通用的,插入和更新都可以使用 但是當字段存在值 的時候不進行填充
this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 該方法有bug請升級到之后的版本如`3.3.1.8-SNAPSHOT`)
// 這個是insert的時候用的,插入的時候時候強制進行填充
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)
// update的時候使用,更新的時候強制進行填充
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)

注意填充的類型,要和你定義字段的類型一致,不然就可能出現(xiàn)填充為為空值的情況 例如原值是java.util.Date ,填充的LocalDateTime就會出現(xiàn)這種情況

到此這篇關(guān)于Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案的文章就介紹到這了,更多相關(guān)Mybatis-plus自動填充內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計模式七大原則之合成復用原則詳解

    Java設(shè)計模式七大原則之合成復用原則詳解

    合成復用原則(Composite Reuse Principle),即盡量使用組合/聚合的方式,而不是使用繼承。本文將為大家具體介紹一下Java設(shè)計模式七大原則之一的合成復用原則,需要的可以參考一下
    2022-02-02
  • Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    Struts2開發(fā) 基本配置與類型轉(zhuǎn)換

    本篇文章,小編將為大家介紹關(guān)于Struts2開發(fā) 基本配置與類型轉(zhuǎn)換,有需要的朋友可以參考一下
    2013-04-04
  • JAVA面試題 start()和run()詳解

    JAVA面試題 start()和run()詳解

    這篇文章主要介紹了JAVA面試題 啟動線程是start()還是run()?為什么?,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 詳解如何實現(xiàn)OpenAPI開發(fā)動態(tài)處理接口的返回數(shù)據(jù)

    詳解如何實現(xiàn)OpenAPI開發(fā)動態(tài)處理接口的返回數(shù)據(jù)

    這篇文章主要為大家介紹了OpenAPI開發(fā)動態(tài)處理接口的返回數(shù)據(jù)如何實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java使用CompletableFuture進行非阻塞IO詳解

    Java使用CompletableFuture進行非阻塞IO詳解

    這篇文章主要介紹了Java使用CompletableFuture進行非阻塞IO詳解,CompletableFuture是Java中的一個類,用于支持異步編程和處理異步任務(wù)的結(jié)果,它提供了一種方便的方式來處理異步操作,并允許我們以非阻塞的方式執(zhí)行任務(wù),需要的朋友可以參考下
    2023-09-09
  • 使用Spring?AOP實現(xiàn)用戶操作日志功能

    使用Spring?AOP實現(xiàn)用戶操作日志功能

    這篇文章主要介紹了使用Spring?AOP實現(xiàn)了用戶操作日志功能,功能實現(xiàn)需要一張記錄日志的log表,結(jié)合示例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Java咖啡館(1)——嘆咖啡

    Java咖啡館(1)——嘆咖啡

    這篇文章主要給大家介紹了關(guān)于Java咖啡館之嘆咖啡,需要的朋友可以參考下
    2006-12-12
  • java使用minio上傳下載文件完整版教程

    java使用minio上傳下載文件完整版教程

    本示例教程介紹了如何使用SpringBoot框架結(jié)合MinIO服務(wù)實現(xiàn)文件的上傳和下載功能,并將文件信息存儲在數(shù)據(jù)庫的file表中,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • 淺談一下Java中的訪問修飾符以及作用

    淺談一下Java中的訪問修飾符以及作用

    這篇文章主要介紹了淺談一下Java中的訪問修飾符以及作用,修飾符修飾的是“被訪問”的權(quán)限,所有修飾符都可以修飾成員變量,方法,構(gòu)造方法,需要的朋友可以參考下
    2023-05-05
  • IDEA?服務(wù)器熱部署圖文詳解(On?Update?action/On?frame?deactivation)

    IDEA?服務(wù)器熱部署圖文詳解(On?Update?action/On?frame?deactivation)

    這篇文章主要介紹了IDEA?服務(wù)器熱部署詳解(On?Update?action/On?frame?deactivation),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論

马山县| 望谟县| 东乌| 克山县| 刚察县| 平和县| 左权县| 工布江达县| 成武县| 黑水县| 古田县| 仙居县| 阜新| 新干县| 平潭县| 搜索| 松江区| 华坪县| 江油市| 维西| 太白县| 太和县| 紫金县| 兴安盟| 永善县| 麻阳| 岳阳市| 富裕县| 封开县| 阜城县| 定安县| 侯马市| 盘山县| 原平市| 绥芬河市| 洮南市| 镇宁| 林芝县| 鲜城| 酒泉市| 茂名市|