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

MyBatis-Plus解決字段不更新為null的六大解決方案

 更新時(shí)間:2026年01月05日 09:41:32   作者:阿薩德528號(hào)  
MyBatis-Plus 默認(rèn)情況下不會(huì)將字段更新為 null,這是出于防止誤操作的考慮,本文為大家整理了6個(gè)解決方法,大家可以根據(jù)自己的需求進(jìn)行選擇

MyBatis-Plus 默認(rèn)情況下不會(huì)將字段更新為 null,這是出于防止誤操作的考慮。以下是幾種解決方案:

1.使用 UpdateWrapper(推薦)

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name", null)
            .set("age", null)
            .eq("id", 1);

userMapper.update(null, updateWrapper); // null表示不使用實(shí)體類傳遞參數(shù)

2.使用 LambdaUpdateWrapper(類型安全)

LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(User::getName, null)
            .set(User::getAge, null)
            .eq(User::getId, 1);

userMapper.update(null, updateWrapper); // null表示不使用實(shí)體類傳遞參數(shù)

3.實(shí)體類 + 字段策略配置(全局/局部)

全局配置(在配置文件中)

mybatis-plus:
  global-config:
    db-config:
      # 忽略null值字段,這里設(shè)置為false才會(huì)更新null值
      update-strategy: ignored
      # 可選值: 
      # ignored: 忽略null值(默認(rèn))
      # not_null: 只更新非null值
      # not_empty: 只更新非空值

局部配置(在字段上使用注解)

public class User {
    @TableField(strategy = FieldStrategy.IGNORED)  // 總是更新,包括null
    private String name;
    
    @TableField(updateStrategy = FieldStrategy.IGNORED)  // 僅更新時(shí)忽略策略
    private Integer age;
}

FieldStrategy 選項(xiàng):

  • IGNORED:忽略判斷,總是更新(包括null)
  • NOT_NULL:非 NULL 判斷(默認(rèn))
  • NOT_EMPTY:非空判斷(字符串額外檢查空串)
  • NEVER:不加入SQL

4.使用insertOrUpdate方法

User user = new User();
user.setId(1L);
user.setName(null);  // 需要結(jié)合字段策略配置

userMapper.insertOrUpdate(user);

5.自定義 SQL(復(fù)雜情況)

// 在 Mapper 接口中
@Update("UPDATE user SET name = null WHERE id = #{id}")
int updateNameToNull(@Param("id") Long id);

6.使用alwaysUpdateSomeColumnById方法(插件方式)

添加插件配置:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new AlwaysUpdateSomeColumnByIdInnerInterceptor());
    return interceptor;
}

最佳實(shí)踐建議

場(chǎng)景1:偶爾需要更新為null

// 使用 UpdateWrapper,不需要修改實(shí)體類注解
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("email", null)
      .eq("id", userId);
userMapper.update(null, wrapper);

場(chǎng)景2:特定字段經(jīng)常需要更新為null

// 在實(shí)體類字段上添加注解
public class User {
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String nickname;  // 該字段可以更新為null
}

場(chǎng)景3:批量更新為null

List<Long> ids = Arrays.asList(1L, 2L, 3L);
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getAvatar, null)
      .in(User::getId, ids);
userMapper.update(null, wrapper);

注意事項(xiàng)

  • 性能考慮FieldStrategy.IGNORED 會(huì)使該字段在所有更新操作中都參與SQL生成
  • 數(shù)據(jù)安全:謹(jǐn)慎使用全局配置,防止誤操作
  • 推薦做法:需要更新為null的字段使用注解,其他字段保持默認(rèn)
  • 版本兼容:不同版本的MyBatis-Plus可能有不同的策略名稱

常見(jiàn)問(wèn)題

Q:為什么設(shè)置了null但數(shù)據(jù)庫(kù)沒(méi)更新?

A:檢查字段是否使用了 @TableField(updateStrategy = NOT_NULL)(默認(rèn)策略)

Q:如何讓某個(gè)字段插入時(shí)可以為null,更新時(shí)不為null?

@TableField(insertStrategy = FieldStrategy.IGNORED, 
            updateStrategy = FieldStrategy.NOT_NULL)
private String phone;

Q:更新部分字段為null,部分字段保持原值?

User user = new User();
user.setId(1L);
user.setName(null);

LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getName, null)      // 更新為null
      .set(User::getAge, user.getAge()) // 保持原值
      .eq(User::getId, user.getId());
userMapper.update(null, wrapper);

建議

根據(jù)具體場(chǎng)景選擇合適的方法,一般推薦使用 UpdateWrapper 方式,因?yàn)樗铎`活且不會(huì)影響其他操作的默認(rèn)行為。

// ? 錯(cuò)誤:實(shí)體對(duì)象無(wú)法設(shè)置null值(默認(rèn)策略會(huì)忽略null)
User user = new User();
user.setId(1L);
user.setName(null);  // 這個(gè)null會(huì)被忽略,不會(huì)更新到數(shù)據(jù)庫(kù)

UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 1);

userMapper.update(user, wrapper);  // name不會(huì)被更新為null

// ? 正確:使用wrapper.set()可以更新為null
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("name", null)  // 明確設(shè)置null值
      .eq("id", 1);

userMapper.update(null, wrapper);  // name會(huì)被更新為NULL

到此這篇關(guān)于MyBatis-Plus解決字段不更新為null的六大解決方案的文章就介紹到這了,更多相關(guān)MyBatis Plus更新字段為null內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

舟曲县| 西吉县| 正蓝旗| 鄂托克前旗| 黑龙江省| 阿尔山市| 旬邑县| 铜山县| 石泉县| 格尔木市| 常州市| 城市| 莆田市| 北京市| 彰化县| 搜索| 西和县| 大洼县| 盘锦市| 平陆县| 永平县| 涿州市| 赤城县| 栾川县| 南京市| 延长县| 连州市| 崇州市| 万全县| 海晏县| 红桥区| 抚州市| 平乡县| 循化| 南雄市| 利辛县| 攀枝花市| 普格县| 鹰潭市| 宾阳县| 张家川|