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;它我们的空间看起来更整洁。但是衣柜的材料值得我们好好考虑一下。衣柜门有哪些材质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…

光功率 博科交换机_如何将交换机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;确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。 目前大多数的网络通讯格式已经从…

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

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

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

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

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

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

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

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

grep -e命令详解_grep中的正则表达式

grep是Linux中用于处理文件的工具之一。grep搜索输入文件&#xff0c;查找与正则表达式匹配的行&#xff0c;并将每个匹配的行标准输出。正则表达式是匹配一组字符串的模式。模式由操作符、构造文字字符和具有特殊意义的元字符组成。grep支持三种正则表达式语法:Basic、Extende…

幼儿课外活动游戏_泰国清迈大小学校介绍 --【Little Star小星星幼儿园】

细数清迈的大小学校&#xff0c;主要分为国际学校和双语学校.一般国际学校的课程设置为10%的泰语&#xff0c;90%的英语&#xff0c;一些中文国际学校设置为20%-30%中文。国际学校可按照学制区分&#xff0c;美制、英制、德制、IB、新加坡等一系列课程。双语学校则为40%的泰语&…

Java8 Stream集合的筛选、归约、分组、聚合详解+案例

文章目录1 Stream概述2 Stream的创建3 Stream的使用案例使用的员工类3.1 遍历/匹配&#xff08;foreach/find/match&#xff09;3.2 筛选&#xff08;filter&#xff09;3.3 聚合&#xff08;max/min/count)3.4 映射(map/flatMap)3.5 归约(reduce)3.6 收集(collect)3.6.1 归集(…

liunx宝塔配置https_宝塔面板安装教程

宝塔面板安装教程原创 计科青年 今天首先登陆阿里云官网登陆你买的阿里云服务器打开服务器控制台&#xff0c;点击购买的服务器&#xff0c;点击实例&#xff0c;就可以看见自己的公网IP。1.下载Xshell6远程连接软件&#xff0c;打开软件点击文件新建这里推荐大家使用Xshell6进…

java用户角色权限管理 只显示姓_快递物流管理系统SSM,JQUERYEASYUI,MYSQL

快递物流管理系统(SSM,JQUERY-EASYUI,MYSQL)(毕业论文27564字,共78页,程序代码,MySQL数据库) 全套项目下载地址: http://woc.xin/WQBgtE【运行环境】 Eclipse, IDEA JDK1.7(JDK1.8) Tomcat7(Tomcat8)【技术栈】 JAVA, JSP, SSM, JQUERY, JQUERY EASYUI, MYSQL, HTML, CSS, JAVA…

判刑后再上诉会改判吗_近视眼手术后还会再近视反弹吗?有哪些后遗症,温州眼科专家告诉你...

经过几代的更新发展&#xff0c;近视眼手术的技术已相当成熟。激光近视手术受到越来越多近视患者的青睐&#xff0c;飞秒激光近视手术俨然成为目前矫正近视的新潮流。很多人以为&#xff0c;有了近视手术后便不需要注意近视的防控。轻松摘镜的背后&#xff0c;是彻夜狂欢&#…

dev c++调试怎么看变量的值_利用GDB调试 MSQL

原创 张政俊 老叶茶馆来自专辑MySQL修行作者&#xff1a;张政俊就职于中欧基金&#xff0c;知数堂粉丝&#xff0c;数据库爱好者&#xff0c;熟悉RDBMS、nosql、new sql等各类数据库。啃完Oreilly的《高性能mysql》、姜老师的《MySQL技术内幕》&#xff0c;再加上个2,3年的实战…

案例 自动办公_办公自动化案例教程(双色)(含微课)

办公自动化案例教程(双色)(含微课)ISBN:978-7-5165-1852-6作者&#xff1a;贺鑫 彭卫华 李胜华定价&#xff1a;48.00元出版社&#xff1a;航空工业出版社适用层次&#xff1a;通用出版日期&#xff1a;2020-05-01项目一 使用Word制作常用公文项目描述学习要点任务一 制作行政…

柱形图无数据可选中_Excel – 如何制作出上下层排列的柱形图?

如何将同一个数据表中的不同数据列排列成上下两层柱形图&#xff1f;案例&#xff1a;将下图 1 的数据表制作成柱形图&#xff0c;要求将销量和利润的柱形分成两个图表上下排列。效果如下图 2 所示。解决方案&#xff1a;1. 选中整个数据表区域 --> 选择菜单栏的“插入”--&…

html画布360图案填充_在Photoshop中创建带有图案的抽象设计

效果图知识点&#xff1a;应用选区工具结合图层混合模式和混合选项&#xff0c;创造出唯美的抽象类画册 效果设计本身由一系列同心圆组成&#xff0c;每组的大小各不相同。每个圆都有6个核心色板的底色&#xff0c;然后渐变和图案填充会增加细节和深度。我们需要创建图案填充。…

emd实现信息隐藏_EMD算法原理与实现

欢迎关注我们&#xff0c;选择加"星标"或“置顶”更多技术&#xff0c;第一时间送达SSVEP信号中含有自发脑电和大量外界干扰信号&#xff0c;属于典型的非线性非平稳信号。传统的滤波方法通常不满足对非线性非平稳分析的条件&#xff0c;1998年黄鄂提出希尔伯特黄变换…

转为yaml python_python 如何使用HttpRunner做接口自动化测试

作者&#xff1a;星安果 来源&#xff1a;AirPython1. 前言原始测试金子塔包含 3 层&#xff0c;分别是&#xff1a;UI 自动化测试、接口服务测试、单元测试其中&#xff0c;单元测试是对软件的最小可测试单元进行检查和验证&#xff0c;也是产生效率最大的一项测试接口服务测试…