Mybatis-Plus字段策略FieldStrategy详解

文章目录

  • 一、官方文档
  • 二、字段策略介绍
    • 1、FieldStrategy作用
    • 2、FieldStrategy类型
    • 3、FieldStrategy配置
      • 全局策略配置
      • 单字段策略配置
  • 三、实战说明
    • 1.默认策略 - NOT_NULL
    • 2.忽略判断-IGNORED
    • 3.从不处理-NEVER
    • 4.字符不为空-NOT_EMPTY
    • 5.跟随全局-DEFAULT
  • 总结

一、官方文档

Mybatis-Plus中FieldStrategy说明:https://baomidou.com/pages/223848/#tableid

二、字段策略介绍

1、FieldStrategy作用

Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时,根据配置的策略判断是否对实体对象的值进行空值判断,如果策略为字段不能为空,则不会对为空的字段进行赋值或更新。
同样,在进行where条件查询时,根据whereStrategy策略判断是否对字段进行空值判断,如果策略为字段不能为空,则为空的字段不会作为查询条件组装到where条件中。

三个配置,对应三种使用场景

  • insertStrategy 在insert操作时的字段策略,是否进行空值判断,插入空值
  • updateStrategy 在update操作时的字段策略,是否进行空值判断,插入空值
  • whereStrategy 在where条件组装时,是否进行控制判断,将空值作为查询条件

在这里插入图片描述

2、FieldStrategy类型

FieldStrategy的源码中,一共有5种策略类型。

public enum FieldStrategy {IGNORED,NOT_NULL,NOT_EMPTY,DEFAULT,NEVER;private FieldStrategy() {}
}

每种策略的作用:

描述
IGNORED忽略空值判断,实体对象的字段是什么值就用什么值更新,支持null值更新操作
NOT_NULL进行非NULL判断,也是默认策略,相当于age!=null
NOT_EMPTY进行非空判断,主要是针对字符串类型,相当于name != null and name != ‘’
NEVER从不更新,不管字段是否有值,都不进行更新
DEFAULT追随全局配置

3、FieldStrategy配置

全局策略配置

在全局配置中,三者的默认值都是FieldStrategy.NOT_NULL,即进行空值判断,不对NULL值数据进行处理。

public DbConfig() {this.idType = IdType.ASSIGN_ID;this.tableUnderline = true;this.capitalMode = false;this.logicDeleteValue = "1";this.logicNotDeleteValue = "0";this.insertStrategy = FieldStrategy.NOT_NULL;this.updateStrategy = FieldStrategy.NOT_NULL;this.whereStrategy = FieldStrategy.NOT_NULL;
}

在spring boot中可以通过配置属性修改全局字段策略:

mybatis-plus.global-config.db-config.update-strategy=not_null
mybatis-plus.global-config.db-config.insert-strategy=not_null
mybatis-plus.global-config.db-config.where-strategy=not_null

单字段策略配置

在实体对象中,通过@TableField注解可以针对单个字段指定字段策略。

示例:

@TableName(value ="user")
@Data
public class User implements Serializable {@TableIdprivate Long id;private String name;private Integer age;//配置字段更新策略:不能为空@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)private String email;}

@TableField注解的源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableField {String value() default "";boolean exist() default true;String condition() default "";String update() default "";//插入策略FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;//更新策略FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;//where条件策略FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;FieldFill fill() default FieldFill.DEFAULT;boolean select() default true;boolean keepGlobalFormat() default false;String property() default "";JdbcType jdbcType() default JdbcType.UNDEFINED;Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;boolean javaType() default false;String numericScale() default "";
}

其中,insertStrategy、updateStrategy和whereStrategy的默认策略都是FieldStrategy.DEFAULT,表示跟随全局配置。

三、实战说明

以更新操作updateById为例,演示各种策略的作用。

1.默认策略 - NOT_NULL

默认策略为FieldStrategy.NOT_NULL,表示需要进行非NULL判断,只有不为NULL的字段才会参与数据处理。
相当于mybatis的xml文件中的if判定条件判断:age!=null

<if test="age != null">AND t.age = #{age}
</if>

代码如下(示例):

@TableName(value ="user")
@Data
public class User implements Serializable {@TableIdprivate Long id;private String name;private Integer age;//NOT_NULL为默认的全局策略//@TableField(updateStrategy = FieldStrategy.NOT_NULL)private String email;
}

单元测试:

 @Testpublic void testUpdateById() {System.out.println("----- updateById method test ------");User user = new User();user.setId(1543920054188400641L);user.setName("test");user.setAge(13);//email字段为null//user.setEmail("");userMapper.updateById(user);System.out.println(user.toString());}

执行结果:
在这里插入图片描述
为null的字段email没有参与更新操作。
updateStrategy的默认策略是FieldStrategy.DEFAULT,表示跟随全局配置。而全局的默认策略是FieldStrategy.NOT_NULL,即进行NULL值判断,如果为NULL,则不更新对应的字段。

2.忽略判断-IGNORED

@TableName(value ="user")
@Data
public class User implements Serializable {@TableIdprivate Long id;private String name;private Integer age;@TableField(updateStrategy = FieldStrategy.IGNORED)private String email;
}

再次执行上面的单元测试:
在这里插入图片描述
可以看到,尽管email字段的值为null,但还是进行了更新操作。
说明策略FieldStrategy.IGNORED会忽略字段值的空值判断,无论实体对象的字段值是否为空,都会进行更新操作。

3.从不处理-NEVER

@TableName(value ="user")
@Data
public class User implements Serializable {@TableIdprivate Long id;private String name;private Integer age;@TableField(updateStrategy = FieldStrategy.NEVER)private String email;
}

指定email字段不为空,进行单元测试:

 @Testpublic void testUpdateById() {System.out.println("----- updateById method test ------");User user = new User();user.setId(1543920054188400641L);user.setName("test");user.setAge(13);//email字段不为空user.setEmail("101@qq.com");userMapper.updateById(user);System.out.println(user.toString());}

执行结果:
在这里插入图片描述
尽管email字段有值,但还是没有进行了更新操作。
说明策略FieldStrategy.NEVER不但会忽略字段值的空值判断,而且不管标识的字段是否有值,都不会进行更新操作。

4.字符不为空-NOT_EMPTY

策略FieldStrategy.NOT_EMPTY表示需要对字符串进行空值判断,只有非空字符串的字段才会参与数据处理。
相当于mybatis的xml文件中的if判定条件判断:name != null and name != ''

<if test="name != null and name != '' ">AND t.name like CONCAT('%',#{name},'%')</if>
@TableName(value ="user")
@Data
public class User implements Serializable {@TableIdprivate Long id;private String name;private Integer age;@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)private String email;
}

指定email字段不为空,进行单元测试:

 @Testpublic void testUpdateById() {System.out.println("----- updateById method test ------");User user = new User();user.setId(1543920054188400641L);user.setName("test");user.setAge(13);//email字段不为空user.setEmail("101@qq.com");userMapper.updateById(user);System.out.println(user.toString());}

执行结果:
email字段有值的时候,正常更新。
在这里插入图片描述

指定email字段为空字符串,进行单元测试:

 @Testpublic void testUpdateById() {System.out.println("----- updateById method test ------");User user = new User();user.setId(1543920054188400641L);user.setName("test");user.setAge(13);//email字段为空字符串user.setEmail("");userMapper.updateById(user);System.out.println(user.toString());}

执行结果:
email字段为空字符串时,不会参与更新操作。
在这里插入图片描述

5.跟随全局-DEFAULT

策略FieldStrategy.DEFAULT表示追随全局配置的字段策略,这也是字段级别的默认策略。而全局的字段策略,默认是FieldStrategy.NOT_NULL

这里就不做继续演示。


总结

本文主要是详细介绍了Mybatis-Plus字段策略FieldStrategy的作用和使用方法。
1、字段策略的3个使用场景:

  • insertStrategy insert操作时的字段策略,是否进行空值判断,插入空值
  • updateStrategy update操作时的字段策略,是否进行空值判断,插入空值
  • whereStrategy where条件组装时的字段策略,是否进行控制判断,将空值作为查询条件

2、字段策略的5种类型:

  • IGNORED 忽略空值判断,实体对象的字段是什么值就用什么值更新,支持null值更新操作
  • NOT_NULL 进行非NULL判断,相当于age!=null,也是默认的策略
  • NOT_EMPTY 进行非空判断,主要是针对字符串类型的字段,相当于name != null and name != ''
  • NEVER 从不更新,不管字段是否有值,都不进行更新
  • DEFAULT 追随全局配置
package com.baomidou.mybatisplus.annotation;
public enum FieldStrategy {IGNORED, //忽略数值为null,但是有风险 别人都这么说NOT_NULL, //数值不能为null,“”NOT_EMPTY,//为null,为空串的忽略,就是如果设置值为null,“”,不会插入数据库DEFAULT,//默认,如果数值为null,就跳过该条数据NEVER;//不保存该数据private FieldStrategy() {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动硬盘接口坏了怎么办解决教程

移动硬盘由于在使用中掉落或者经常插拔&#xff0c;会导致移动硬盘的接口的损坏&#xff0c;其实就是移动硬盘端的usb接口的损坏&#xff0c;而很多时候只是这个接口的焊点松动&#xff0c;有时候确是本身掉落金属手指导致损坏&#xff0c;而其实解决方法真正有效的有两种。 移…

任意门怎么用团发_衣柜门选用什么材料好?小编在这里告诉你

衣柜是美观家庭必不可少的&#xff0c;它我们的空间看起来更整洁。但是衣柜的材料值得我们好好考虑一下。衣柜门有哪些材质1、铝合金铝合金材质的衣柜门在日常生活中比较常见&#xff0c;使用得比较多。这是因为其环保性能比较好&#xff0c;而且十分耐用&#xff0c;还具有较强…

Google Gson API 介绍与使用

文章目录Gson基本操作Gson 概述与下载Gson (反)序列化 Java 对象JsonElement Json 元素JsonObject Json 对象JsonArray Json 数组JsonParser Json 解析GsonBuilder 构建 GsonJsonElement的简单说明JsonElement&#xff1a;JsonPrimitive&#xff1a;JsonNull:JsonArray:JsonObj…

移动硬盘读取速度一般是多少

移动硬盘现在已经普及很高了&#xff0c;几乎有存储需要的朋友都有一个移动硬盘&#xff0c;而且现在的移动硬盘已经升级到usb3.0的了&#xff0c;以前的usb2.0的移动硬盘逐渐淘汰&#xff0c;那么很多朋友在问移动硬盘的读取速度一般是多少算正常呢&#xff0c;下面就给大家测…

光功率 博科交换机_如何将交换机40G QSFP+与10G SFP+端口互连?

随着40G以太网的到来&#xff0c;许多企业用户开始充分利用当前的10G网络设备升级到40G网络&#xff0c;具体来说也就是如何将带有QSFP端口的40G交换机与现有带SFP端口的10G设备(交换机和服务器)搭配使用的问题。在本篇文章中&#xff0c;易天光通信(ETU-LINK)将分享三种常见的…

Gson使用Gson工具类GsonUtils(项目中要求不要使用Fastjson,原因:Fastjson存在安全漏洞)

一、概述 Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛&#xff0c;所以非常有必要对其进行系统的学习。 json是一种数据格式&#xff0c;确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。 目前大多数的网络通讯格式已经从…

浅析怎样提升win7 旗舰版系统显示质量

今天小编给大家浅析怎样提升win7 旗舰版系统显示质量&#xff0c;大家一起来了解下吧&#xff0c;具体如下&#xff1a; 一、打开的程序或窗口的数量尽量减少 当你打开的程序越多&#xff0c;Windows 所需的系统资源也就越多。请将当前没有使用的程序关闭&#xff0c;或缩小窗…

keil 函数最多可以传几个参数_007 函数进阶,来做一次比较正式的作业

这节课开始之前&#xff0c;先来解决一个小问题。最近这两节课&#xff0c;有人对缩进的规则不太理解&#xff0c;这里解释一下。如上图所示&#xff0c;相同的缩进代表同一个代码块&#xff0c;即同一个顺序执行代码段落。如果代码缩进减少&#xff0c;则说明当前代码块结束&a…

Win7休眠后唤醒出现黑屏的解决办法

进入睡眠状态可很好地节约电源和延长硬件的使用寿命&#xff0c;很多用户的电脑进入睡眠状态后&#xff0c;唤醒无法正常进入屏幕&#xff0c;而是变成黑屏的故障&#xff0c;怎么回事?其实出现这种情况并非什么系统故障问题&#xff0c;下面小编给大家分享Win7休眠后唤醒出现…

Map按照Value值进行排序的实现

Map按照Value值进行排序的实现 map.entrySet().stream().sorted(Comparator<? super T> comparator)给定一个map&#xff0c;存储一个nums数组中每一个数字存储的次数&#xff0c;最后将这个map按照value值&#xff0c;即出现的次数进行排序 第一种方式&#xff1a;返…

传授电脑蓝屏开不了机怎么办

电脑是现代社会不可缺少的重要工具&#xff0c;不仅可以帮助处理复杂的数据&#xff0c;还可以辅助教学&#xff0c;设计&#xff0c;聊天娱乐。下面&#xff0c;我就给大家介绍一下电脑蓝屏开不了机的解决方法&#xff0c;有需要就引起来了解一下吧 大家在使用电脑的时候有没…

华为核心交换如何配置源地址转换_华为三层交换机配置步骤解释资料全

word格式文档专业整理华为三层交换机配置步骤1.给交换机划分VLANVlan是虚拟局域网的意思&#xff0c;它相当于一个局域网工作组。“vlan几”可以理解成编号为几的vlan&#xff0c;比如vlan 2就是编号为2的vlan&#xff0c;只是一个编号而已&#xff0c;并不是说vlan 2的网段一定…

关于Gson的TypeToken

文章目录引言Type是什么获取类型的困惑自定义TypeToken解决问题总结引言 Gson在Json解析中使用广泛, 常用的数据类型都可以解析, 特殊的可以自定义Adapter解析. 在解析大量具有某些相同结构的数据上,我们总想复用已有的类型, 为了复用通常可以使用继承和泛型. 比如服务端返回的…

如何用U盘之家U盘启动盘制作工具实现U盘装系统

若你有一个U盘&#xff0c;本文就带你实现如何来U盘装系统&#xff0c;完全丢掉你的光驱&#xff0c;虽然这个工具比较老了&#xff0c;但教程一样的适用于现在的电脑。 需要的环境&#xff1a; 本文制作出来的引导方式为USB-HDD或USB-ZIP&#xff0c;无需量产&#xff0c;U盘…

信号回勾产生的原因_燃气减压阀振动的原因及处理方案

燃气减压阀是一种自动降低管路工作压力的专门装置&#xff0c;作用是在给定减压范围后&#xff0c;可以将较高压力的介质减到给定压力。它可将阀前管路较高的液气体压力减少至阀后管路所需的水平。燃气减压阀是各装置广泛使用的仪表之一&#xff0c;它准确正常地工作对保证工艺…

Java判断Bigdecimal类型是否等于0的方法

1.我之前用来判断Bigdecimal类型是否等于0的方法 b.equals(BigDecimal.ZERO); 用equals方法和BigDecimal.ZERO进行比较。 2.上面方法存在的问题 有一天&#xff0c;调用这个这句代码的时候&#xff0c;传入的确实是0&#xff0c;但却返回false 查看源代码发现&#xff1a;…

手把手教你u盘打不开解决教程

u盘打不开怎么办&#xff0c;其实不论说是在工作上&#xff0c;还是学习当中所遇到的问题&#xff0c;都有着与相对应的原因以及相对应的解决方法。那么究竟要怎样才能够修复好u盘呢?想知道?那么就赶紧往下瞧~ 我们在使用u盘时候&#xff0c;经常都会遇上u盘插入电脑打不开的…

c++ _mkdir无法创建文件夹_Python脚本4:根据txt文本,批量创建文件夹

背景&#xff1a;深度学习图像分类的时候&#xff0c;有许多的标签类。1000个标签就需要创建1000个文件夹&#xff0c;文件夹里面放入对应的图像。不可能一个一个右击创建文件夹&#xff0c;所以有了今天的脚本。根据txt文本每一行的类别&#xff0c;创建文件名为类别的文件夹。…

Java8 Stream Collectors groupingBy 和 mapping 配合使用 Collectors.summingInt()分组求和

介绍 Java8 Stream 中 Collectors.groupingBy() 的文章已经很多了&#xff0c;这里想记录一下该方法和 Collectors.mapping() 方法配合使用的一些案例。 一、准备 Student 实体类。 Data AllArgsConstructor public class Student {private String name;private int age;pri…

acer电脑设置u盘启动方法

你们知道acer进入U盘启动系统吗?现在都是流行u盘安装系统了&#xff0c;u盘安装系统都是通过设置u盘启动盘来安装&#xff0c;这就要在BIOS里设置从U盘启动&#xff0c;我知道你们大部分人都知道如何设置&#xff0c;现在就告诉你们acer电脑设置u盘启动方法吧。 一;用快捷热键…