热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MyBatisPlus更新对象无法设空值解决方案

这篇文章主要介绍了MyBatisPlus更新对象无法设空值解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

原因

因为 MyBatis-Plus 自带的更新方法,都有对对象空值进行判空。只有不为空的字段才会进行数据更新。

解决方式

在实体类对应的字段上加注解@TableField(strategy=FieldStrategy.IGNORED),忽略null值的判断,例如:

@TableField(updateStrategy = FieldStrategy.IGNORED)
private String address;

示例:

1、未加注解(无法设入空值,见代码结果):

//实体private String address;
@Test
public void updateUserTest(){
  User user = new User();
  user.setId(1);
  user.setState((byte) 1);
  user.setAddress(null);
  userService.updateById(user);
}
​
//结果
==> Preparing: UPDATE user SET state=? WHERE id=? 
==> Parameters: 1(Byte), 1(Integer)
​

2、加注解(可以设入空值,看代码结果)

//实体@TableField(updateStrategy = FieldStrategy.IGNORED)
private String address;
@Test
public void updateUserTest(){
  User user = new User();
  user.setId(1);
  user.setState((byte) 1);
  user.setAddress(null);
  userService.updateById(user);
}
​
//结果
==> Preparing: UPDATE user SET address=?, state=? WHERE id=? 
==> Parameters: null, 1(Byte), 1(Integer)

3、直接使用 UpdateWrapper

@Test
public void updateUserTest(){
  UpdateWrapper userUpdateWrapper = new UpdateWrapper<>();
  userUpdateWrapper.set("address", null);
  userUpdateWrapper.lambda().eq(User::getId, 1);
  userService.update(userUpdateWrapper);
}
&#8203;
//结果
==> Preparing: UPDATE user SET address=&#63; WHERE (id = &#63;) 
==> Parameters: null, 1(Integer)

附上 MyBatis-Plus 表字段标识 注解类

/**
 * 表字段标识
 *
 * @author hubin sjy tantan
 * @since 2016-09-09
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TableField {
&#8203;
  /**
   * 字段值(驼峰命名方式,该值可无)
   */
  String value() default "";
&#8203;
  /**
   * 是否为数据库表字段
   * 默认 true 存在,false 不存在
   */
  boolean exist() default true;
&#8203;
  /**
   * 字段 where 实体查询比较条件
   * 默认 `=` 等值
   */
  String condition() default "";
&#8203;
  /**
   * 字段 update set 部分注入, 该注解优于 el 注解使用
   * 

* 例1:@TableField(.. , update="%s+1") 其中 %s 会填充为字段 * 输出 SQL 为:update 表 set 字段=字段+1 where ... *

* 例2:@TableField(.. , update="now()") 使用数据库时间 * 输出 SQL 为:update 表 set 字段=now() where ... */ String update() default ""; &#8203; /** * 字段验证策略之 insert: 当insert操作时,该字段拼接insert语句时的策略 * IGNORED: 直接拼接 insert into table_a(column) values (#{columnProperty}); * NOT_NULL: insert into table_a(column) values (#{columnProperty}) * NOT_EMPTY: insert into table_a(column) values (#{columnProperty}) * * @since 3.1.2 */ FieldStrategy insertStrategy() default FieldStrategy.DEFAULT; &#8203; /** * 字段验证策略之 update: 当更新操作时,该字段拼接set语句时的策略 * IGNORED: 直接拼接 update table_a set column=#{columnProperty}, 属性为null/空string都会被set进去 * NOT_NULL: update table_a set column=#{columnProperty} * NOT_EMPTY: update table_a set column=#{columnProperty} * * @since 3.1.2 */ FieldStrategy updateStrategy() default FieldStrategy.DEFAULT; &#8203; /** * 字段验证策略之 where: 表示该字段在拼接where条件时的策略 * IGNORED: 直接拼接 column=#{columnProperty} * NOT_NULL: column=#{columnProperty} * NOT_EMPTY: column=#{columnProperty} * * @since 3.1.2 */ FieldStrategy whereStrategy() default FieldStrategy.DEFAULT; &#8203; /** * 字段自动填充策略 */ FieldFill fill() default FieldFill.DEFAULT; &#8203; /** * 是否进行 select 查询 *

大字段可设置为 false 不加入 select 查询范围

*/ boolean select() default true; &#8203; /** * 是否保持使用全局的 Format 的值 *

只生效于 既设置了全局的 Format 也设置了上面 {@link #value()} 的值

*
  • 如果是 false , 全局的 Format 不生效
  • * * @since 3.1.1 */ boolean keepGlobalFormat() default false; &#8203; /** * JDBC类型 (该默认值不代表会按照该值生效) *

    * {@link ResultMapping#jdbcType} and {@link ParameterMapping#jdbcType} * * @since 3.1.2 */ JdbcType jdbcType() default JdbcType.UNDEFINED; &#8203; /** * 类型处理器 (该默认值不代表会按照该值生效) *

    * {@link ResultMapping#typeHandler} and {@link ParameterMapping#typeHandler} * * @since 3.1.2 */ Class<&#63; extends TypeHandler> typeHandler() default UnknownTypeHandler.class; &#8203; /** * 指定小数点后保留的位数 *

    * {@link ParameterMapping#numericScale} * * @since 3.1.2 */ String numericScale() default ""; }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


    推荐阅读
    • 本文总结了设计、开发和部署Web应用程序时应遵循的一些最佳实践,这些实践结合了个人经验和权威资料,旨在帮助开发者提高Web应用的安全性。 ... [详细]
    • Vulnhub DC3 实战记录与分析
      本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
    • 本文详细探讨了如何在PHP中有效防止SQL注入攻击,特别是在使用MySQL数据库时。文章通过具体示例和专业建议,帮助开发者理解和应用最佳实践。 ... [详细]
    • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
    • Django与Python及其他Web框架的对比
      本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
    • MySQL Administrator: 监控与管理工具
      本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
    • Oracle 10g 和 11g 32位 OCI.DLL 文件下载
      32位 PL/SQL Developer 访问 64位 Oracle 11g 数据库时,需要使用 32位的 OCI.DLL 文件以确保正常连接和数据访问。本文将详细介绍如何获取并配置此文件。 ... [详细]
    • 本文将详细介绍 SQL 中的 SUM 函数及其用法,并通过具体示例展示如何在实际场景中应用。 ... [详细]
    • 开发笔记:empireCMS 帝国cms功能总结 ... [详细]
    • mybatis 详解(七)一对一、一对多、多对多
      mybatis详解(七)------一 ... [详细]
    • 本文介绍了如何在 SQL Server 2005 中创建和使用数据库快照,包括创建数据库、数据表、插入数据、创建快照、查询快照数据以及使用快照进行数据恢复等操作。 ... [详细]
    • 8个IDC大数据基础定义解析丨IDC
      本文针对IDC数据行业相关名词术语进行解析,分为4组相关概念,希望大家读完 ... [详细]
    • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
    • 本文讲述了一位80后的普通男性程序员,尽管没有高学历,但通过不断的努力和学习,在IT行业中逐渐找到了自己的位置。从最初的仓库管理员到现在的多技能开发者,他的职业生涯充满了挑战与机遇。 ... [详细]
    • 理解GiST索引的空间构造原理
      通过空间思维解析GiST索引的构建方式及其在空间数据检索中的应用。 ... [详细]
    author-avatar
    手机用户2602933613
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有