MybatisPlus中field-strategy配置为何总是失效,如何解决?

2026-04-19 19:201阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1288个文字,预计阅读时间需要6分钟。

MybatisPlus中field-strategy配置为何总是失效,如何解决?

场景:前端修改后端传递了几个空字符串。

后端使用MyBatis-Plus作为DAO层。

结果发现空字符串也被更新到了数据库,且MyBatis-Plus的field-strategy设置为2(非空字段)。

解决方案:

1. 检查数据模型:确保数据模型中,与空字符串相关的字段在数据库层面设置了适当的约束,如NOT NULL,以确保不允许空值。

2. MyBatis-Plus配置调整:查看MyBatis-Plus的版本,确认是否有针对空字符串处理的配置选项。如果是较新版本,可能存在自动处理空字符串的逻辑。如果版本较旧,可能需要手动处理。

3. 自定义处理:在DAO层或Service层添加逻辑,检查传入的参数是否为空字符串,如果是,则将其设置为null或特定的默认值。

4. 使用@TableName注解:如果表名有特殊字符或大小写敏感,使用@TableName注解指定正确的表名。

5. 检查字段映射:确保字段映射正确,MyBatis-Plus不会自动处理空字符串。

6. 更新MyBatis-Plus版本:如果当前版本不支持空字符串的处理,考虑升级到支持该功能的最新版本。

7. 代码示例:

java// 在Service层添加逻辑public void updateData(String id, String field, String value) { if (value==null || value.isEmpty()) { value=null; // 或设置为特定默认值 } // 调用DAO层方法 dataMapper.updateDataById(id, field, value);}

通过以上步骤,可以有效地处理MyBatis-Plus在更新操作中遇到空字符串的问题。

场景:

前端修改给后台传递了几个空字符串。后台使用mybatisPlus 作为dao层。结果发现空字符串也更新了,mybatisPlus 的field-strategy设置为 2 非空;

解决思路:

查看mybatisPlus 版本差异。发现field-strategy已经弃用,从3.1.2 后使用下面这几个配置对非空进行判断

insertStrategy

类型:com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:NOT_NULL

字段验证策略之 insert

说明:

在 insert 的时候的字段验证策略 目前没有默认值,等 {@link #fieldStrategy} 完全去除掉,会给个默认值 NOT_NULL 没配则按 {@link #fieldStrategy} 为准

#updateStrategy

类型:com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:NOT_NULL

字段验证策略之 update

说明:

在 update 的时候的字段验证策略 目前没有默认值,等 {@link #fieldStrategy} 完全去除掉,会给个默认值 NOT_NULL 没配则按 {@link #fieldStrategy} 为准

#selectStrategy(since 3.1.2)

类型:com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:NOT_NULL

字段验证策略之 select

说明:

在 select 的时候的字段验证策略: wrapper 根据内部 entity 生成的 where 条件 目前没有默认值,等 {@link #fieldStrategy} 完全去除掉,会给个默认值 NOT_NULL 没配则按 {@link #fieldStrategy} 为准

补充:mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

mybatisPlus中null值插入和更新问题

配置mybatisPlus的项目中,默认进行了不是全量更新的策略:NOT_NULL。

即在利用updateWrapper更新时,会做null判断,如果传参数为null,就不会更新。

在实际项目需求中可能配置全局更新策略为:NOT_NULL,但是某些场景更新时需要插入这个null值进行更新。如何解决这个问题呢?

实际项目解决方法示例一

实际项目中,配置文件中配置全局字段策略为NOT_NULL。

需求:实际项目中,apply_teacher字段当它为null时需要把null值更新进去。

困难:因为全局字段策略为NOT_NULL,所以默认不会更新null值进去。

解决方法:

利用条件构造器当值为null时set为null。

代码:

Wrapper<StuApplyInfoEntity> updateWrapper = new UpdateWrapper<>(); ((UpdateWrapper) updateWrapper).set(saveApply.getApplyTeacher() == null, "apply_teacher", null);

实际项目解决方法示例二

需求:state字段所有值都更新和插入。

困难:因为全局字段策略为NOT_NULL,所以默认不会更新null值进去。

解决方法:

在entity中设置state设置注解@TableField(),配置FieldStrategy为IGNORED。意思是"忽略判断",所有值都更新和插入。

代码:

@TableField(strategy = FieldStrategy.IGNORED, el = "state, jdbcType=VARCHAR") private String state;

field-strategy字段更新插入策略介绍

枚举类FieldStrategy源码

public enum FieldStrategy { /** * 忽略判断 */ IGNORED, /** * 非NULL判断 */ NOT_NULL, /** * 非空判断 */ NOT_EMPTY, /** * 默认的,一般只用于注解里 * <p>1. 在全局里代表 NOT_NULL</p> * <p>2. 在注解里代表 跟随全局</p> */ DEFAULT }

枚举类字段简介

IGNORED:“忽略判断”,所有字段都更新和插入。

NOT_NULL:“非 NULL 判断”,只更新和插入非NULL值。

NOT_EMPTY:“非空判断”, 只更新和插入非NULL值且非空字符串。

DEFAULT: 默认的,一般只用于注解里。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易盾网络。如有错误或未考虑完全的地方,望不吝赐教。

MybatisPlus中field-strategy配置为何总是失效,如何解决?

标签:fieldstrate

本文共计1288个文字,预计阅读时间需要6分钟。

MybatisPlus中field-strategy配置为何总是失效,如何解决?

场景:前端修改后端传递了几个空字符串。

后端使用MyBatis-Plus作为DAO层。

结果发现空字符串也被更新到了数据库,且MyBatis-Plus的field-strategy设置为2(非空字段)。

解决方案:

1. 检查数据模型:确保数据模型中,与空字符串相关的字段在数据库层面设置了适当的约束,如NOT NULL,以确保不允许空值。

2. MyBatis-Plus配置调整:查看MyBatis-Plus的版本,确认是否有针对空字符串处理的配置选项。如果是较新版本,可能存在自动处理空字符串的逻辑。如果版本较旧,可能需要手动处理。

3. 自定义处理:在DAO层或Service层添加逻辑,检查传入的参数是否为空字符串,如果是,则将其设置为null或特定的默认值。

4. 使用@TableName注解:如果表名有特殊字符或大小写敏感,使用@TableName注解指定正确的表名。

5. 检查字段映射:确保字段映射正确,MyBatis-Plus不会自动处理空字符串。

6. 更新MyBatis-Plus版本:如果当前版本不支持空字符串的处理,考虑升级到支持该功能的最新版本。

7. 代码示例:

java// 在Service层添加逻辑public void updateData(String id, String field, String value) { if (value==null || value.isEmpty()) { value=null; // 或设置为特定默认值 } // 调用DAO层方法 dataMapper.updateDataById(id, field, value);}

通过以上步骤,可以有效地处理MyBatis-Plus在更新操作中遇到空字符串的问题。

场景:

前端修改给后台传递了几个空字符串。后台使用mybatisPlus 作为dao层。结果发现空字符串也更新了,mybatisPlus 的field-strategy设置为 2 非空;

解决思路:

查看mybatisPlus 版本差异。发现field-strategy已经弃用,从3.1.2 后使用下面这几个配置对非空进行判断

insertStrategy

类型:com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:NOT_NULL

字段验证策略之 insert

说明:

在 insert 的时候的字段验证策略 目前没有默认值,等 {@link #fieldStrategy} 完全去除掉,会给个默认值 NOT_NULL 没配则按 {@link #fieldStrategy} 为准

#updateStrategy

类型:com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:NOT_NULL

字段验证策略之 update

说明:

在 update 的时候的字段验证策略 目前没有默认值,等 {@link #fieldStrategy} 完全去除掉,会给个默认值 NOT_NULL 没配则按 {@link #fieldStrategy} 为准

#selectStrategy(since 3.1.2)

类型:com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:NOT_NULL

字段验证策略之 select

说明:

在 select 的时候的字段验证策略: wrapper 根据内部 entity 生成的 where 条件 目前没有默认值,等 {@link #fieldStrategy} 完全去除掉,会给个默认值 NOT_NULL 没配则按 {@link #fieldStrategy} 为准

补充:mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

mybatisPlus中null值插入和更新问题

配置mybatisPlus的项目中,默认进行了不是全量更新的策略:NOT_NULL。

即在利用updateWrapper更新时,会做null判断,如果传参数为null,就不会更新。

在实际项目需求中可能配置全局更新策略为:NOT_NULL,但是某些场景更新时需要插入这个null值进行更新。如何解决这个问题呢?

实际项目解决方法示例一

实际项目中,配置文件中配置全局字段策略为NOT_NULL。

需求:实际项目中,apply_teacher字段当它为null时需要把null值更新进去。

困难:因为全局字段策略为NOT_NULL,所以默认不会更新null值进去。

解决方法:

利用条件构造器当值为null时set为null。

代码:

Wrapper<StuApplyInfoEntity> updateWrapper = new UpdateWrapper<>(); ((UpdateWrapper) updateWrapper).set(saveApply.getApplyTeacher() == null, "apply_teacher", null);

实际项目解决方法示例二

需求:state字段所有值都更新和插入。

困难:因为全局字段策略为NOT_NULL,所以默认不会更新null值进去。

解决方法:

在entity中设置state设置注解@TableField(),配置FieldStrategy为IGNORED。意思是"忽略判断",所有值都更新和插入。

代码:

@TableField(strategy = FieldStrategy.IGNORED, el = "state, jdbcType=VARCHAR") private String state;

field-strategy字段更新插入策略介绍

枚举类FieldStrategy源码

public enum FieldStrategy { /** * 忽略判断 */ IGNORED, /** * 非NULL判断 */ NOT_NULL, /** * 非空判断 */ NOT_EMPTY, /** * 默认的,一般只用于注解里 * <p>1. 在全局里代表 NOT_NULL</p> * <p>2. 在注解里代表 跟随全局</p> */ DEFAULT }

枚举类字段简介

IGNORED:“忽略判断”,所有字段都更新和插入。

NOT_NULL:“非 NULL 判断”,只更新和插入非NULL值。

NOT_EMPTY:“非空判断”, 只更新和插入非NULL值且非空字符串。

DEFAULT: 默认的,一般只用于注解里。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易盾网络。如有错误或未考虑完全的地方,望不吝赐教。

MybatisPlus中field-strategy配置为何总是失效,如何解决?

标签:fieldstrate