亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關于mybatis-plus邏輯刪除自動填充更新時間的問題

 更新時間:2022年07月01日 15:27:34   作者:用戶1875908598375  
mybatis-plus是對mybatis的增強,mybatis-plus更像是面向?qū)ο缶幊?,?shù)據(jù)庫基本CRUD的操作可以不用手動編寫SQL語句,大大提高了開發(fā)的效率,這篇文章主要介紹了mybatis-plus邏輯刪除自動填充更新時間問題,需要的朋友可以參考下

前言

mybatis-plus是對mybatis的增強,mybatis-plus更像是面向?qū)ο缶幊?,?shù)據(jù)庫基本CRUD的操作可以不用手動編寫SQL語句,大大提高了開發(fā)的效率。

mybatis-plus有一個擴展功能:自動填充。此功能常見的應用場景為,插入數(shù)據(jù)的時候自動添加創(chuàng)建時間、創(chuàng)建人、修改時間、修改人、刪除標記。通過實現(xiàn)MetaObjectHandler接口,重寫insertFill、updateFill方法,當我們插入和修改數(shù)據(jù)的時候可以自動添加指定字段的值。

mybatis-plus還有另一個擴展功能:邏輯刪除。當我刪除某條數(shù)據(jù)時,其實是通過一條update語句修改數(shù)據(jù)的刪除標記字段。

問題發(fā)現(xiàn)

當配置了自動填充,然后通過mapperdeleteById方法可以實現(xiàn)修改刪除標記,但是無法自動填充修改時間字段,即修改了數(shù)據(jù),但是更新時間沒有被修改為當前時間。

刪除前數(shù)據(jù)狀態(tài),刪除標記為0,更新時間為:2022-06-30 14:56:16。如圖:

調(diào)用接口進行刪除,刪除標記為1,因為更新時間字段設置了如果為空的時候利用數(shù)據(jù)庫生成的默認時間,系統(tǒng)未設置更新時間,所以更新時間為:2022-06-30 09:15:59。如圖:

@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
    int count = orderInfoMapper.deleteById(id);// 邏輯刪除不能自動填充更新時間
    if (count > 0) {
        return true;
    }
    return false;
}

應用系統(tǒng)的打印的SQL語句沒有設置時間。如圖:

因為數(shù)據(jù)庫沒有調(diào)整時區(qū),所以數(shù)據(jù)庫默認的時間看起來有點不太正常,請忽略。至少能看出來更新時間是數(shù)據(jù)庫生成的時間,并不是因為應用系統(tǒng)設置的時間。

以下的寫法也不能自動填充更新時間。

@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
    LambdaQueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<OrderInfo>().lambda();
    queryWrapper.eq(OrderInfo::getId,id);
    nt count = orderInfoMapper.delete(queryWrapper); // 邏輯刪除不能自動填充更新時間

    if (count > 0) {
        return true;
    }
    return false;
}

尋找原因

查看官網(wǎng)關于邏輯刪除的章節(jié)描述。查看常見問題小節(jié)。如圖:

官方也有說刪除接口自動填充功能失效。

官方的使用說明也有說明邏輯刪除的使用方法:

解決方法

方法一

根據(jù)官方的提示1. 使用 update 方法并: UpdateWrapper.set(column, value)(推薦)。

代碼實踐如下:

@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
    LambdaUpdateWrapper<OrderInfo> updateWrapper = new UpdateWrapper<OrderInfo>().lambda();
    
    updateWrapper.eq(OrderInfo::getId, id).set(OrderInfo::getDeleteFlag, 1);
    int count = orderInfoMapper.update(new OrderInfo(), updateWrapper);
    
    if (count > 0) {
        return true;
    }
    return false;
}

執(zhí)行SQL語句:

數(shù)據(jù)結(jié)果:

方法二

根據(jù)官方的提示1. 使用Sql注入器注入com.baomidou.mybatisplus.extension.injector.methods.LogicDeleteByIdWithFill并使用(推薦)。查看LogicDeleteByIdWithFill類。

發(fā)現(xiàn)已經(jīng)被表示為過時了,但是根據(jù)注釋發(fā)現(xiàn),邏輯刪除的時候,可以通過傳入entity參數(shù),這樣就會有可能進行字段字段填充。

代碼如下:

@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
    OrderInfo orderInfo = new OrderInfo();
    int count = orderInfoMapper.deleteById(orderInfo.setId(id));
    if (count > 0) {
        return true;
    }
    return false;
}

SQL語句中的確自動填填充了修改時間字段的值,數(shù)據(jù)中也的確更新了修改時間。

補充寫法

@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
    LambdaUpdateWrapper<OrderInfo> updateWrapper = new UpdateWrapper<OrderInfo>().lambda();
    updateWrapper.eq(OrderInfo::getId,id);
    OrderInfo orderInfo = new OrderInfo();
    orderInfo.setDeleteFlag(true);
    int count = orderInfoMapper.update(orderInfo, updateWrapper);
    // updateWrapper.eq(OrderInfo::getId, id).set(OrderInfo::getDeleteFlag, 1);
    // int count = orderInfoMapper.update(new OrderInfo(), updateWrapper);
    if (count > 0) {
        return true;
    }
    return false;
}
@Transactional(rollbackFor = Exception.class)
public boolean removeById(Long id) {
    LambdaUpdateWrapper<OrderInfo> updateWrapper = new UpdateWrapper<OrderInfo>().lambda();
    updateWrapper.eq(OrderInfo::getId, id).set(OrderInfo::getDeleteFlag, 1);
    int count = orderInfoMapper.update(new OrderInfo(), updateWrapper);
    if (count > 0) {
        return true;
    }
    return false;
}

到此這篇關于mybatis-plus邏輯刪除自動填充更新時間的文章就介紹到這了,更多相關mybatis-plus邏輯刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論