解決Mybatis-Plus更新方法不更新NULL字段的問題
Mybatis-Plus更新方法不更新NULL字段
使用Mybatis-Plus中提供的updateById方法時遇到的一些問題,分享出來,避免大家踩坑,想將查詢結(jié)果中某個字段更新為null,但結(jié)果該字段更新失敗,執(zhí)行更新方法后還是查詢的原來的結(jié)果,沒有變。
查詢Mybatis-Plus的FieldStrategy:
由圖中可以看到,更新策略支持5種類型:默認(rèn)是追隨全局配置globalConfig,
mybatis-plus: ...... configuration: ...... global-config: ...... db-config: ......
如果沒有進(jìn)行全局配置的話,會采用NOT_NULL的更新策略(sql上會加上不為NULL的判斷)。
解決辦法
1.設(shè)置全局的field-strategy(默認(rèn)追隨全局配置)
yml文件配置如下:
mybatis-plus: global-config: db-config: update-strategy: ignored
這樣做是全局性配置,會對所有的字段都忽略判斷,如果一些字段不想要修改,但是傳值的時候沒有傳遞過來,就會被更新為null,可能會影響其他業(yè)務(wù)數(shù)據(jù)的正確性。
2.在屬性上添加單獨(dú)的更新策略
/** * 申報組織 */ @ApiModelProperty("申報組織") @ExcelProperty(value = "申報組織", converter = DeptConverter.class) @TableField(updateStrategy = FieldStrategy.IGNORED) private String reportingOrganization;
在更新代碼中,我們直接使用mybatis-plus中的updateById方法便可以更新成功
3.使用UpdateWrapper方式更新
在mybatis-plus中,除了updateById方法,還提供了一個update方法
// 根據(jù) whereWrapper 條件,更新記錄 boolean update(T updateEntity, Wrapper<T> whereWrapper);
直接使用update方法也可以將字段設(shè)置為null,代碼如下:
/** * update更新字段為null * @param id * @return **/ @Override public boolean updatePatentById(Integer id) { Patent patent = Optional.ofNullable(patentMapper.selectById(id)).orElseThrow(RuntimeException::new); LambdaUpdateWrapper<Patent> Wrapper = new LambdaUpdateWrapper<>(); Wrapper.set(Patent::getCreateTime,null); Wrapper.set(Patent::getCreateUser,123); Wrapper.eq(Patent::getId,patent.getId()); int i = patentMapper.update(patent, Wrapper); return i==1; }
這種方式對其他方法沒有影響,不需要修改全局配置,也不需要在字段上單獨(dú)加注解,推薦使用該方式。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用Java發(fā)送郵件的實(shí)現(xiàn)代碼
這篇文章給大家分享了如何利用Java發(fā)送郵件,文章通過實(shí)例代碼介紹的很詳細(xì),有需要的可以參考借鑒。2016-08-08SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼
這篇文章主要介紹了SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07springboot+redis+lua實(shí)現(xiàn)分布式鎖的腳本
本文介紹了如何使用Spring Boot、Redis和Lua腳本實(shí)現(xiàn)分布式鎖,包括實(shí)現(xiàn)原理、代碼實(shí)現(xiàn)和存在的問題,感興趣的朋友跟隨小編一起看看吧2024-11-11IDEA創(chuàng)建Spring項(xiàng)目無法選擇Java8的問題及解決
文章描述了在使用Spring創(chuàng)建項(xiàng)目時遇到的問題,通過將服務(wù)器地址從https://start.spring.io/替換為https://start.aliyun.com/,成功解決了無法選擇Java8的問題2025-01-01Java中RabbitMQ的幾種消息確認(rèn)機(jī)制
RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過程中,發(fā)送方發(fā)送消息后,接收方需要對消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文主要介紹了Java中RabbitMQ的幾種消息確認(rèn)機(jī)制,具有一定的參考價值,感興趣的可以了解一下2023-12-12淺談Java中實(shí)現(xiàn)深拷貝的兩種方式—clone() & Serialized
這篇文章主要介紹了Java中實(shí)現(xiàn)深拷貝的兩種方式—clone() & Serialized,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03