Mybatis Plus 字段为空值时执行更新方法未更新解决方案

问题描述

系统测试过程中,同事测试出使用Mybatis Plus提供的封装方法UpdateById()时,字段从前台传入的数据为空值,但是执行方法后该字段未得到更新。

问题重现

因涉及到公司层面的模型、数据,本文都为测试模型和例子。

实体类:

@Data
@TableName("shop_item")
public class ShopItem implements Serializable {

   private static final long serialVersionUID = 1L;

  /**
   * 编号
   */
  @TableId(type= IdType.INPUT)
  private String id;

  /**
   * 物品名称
   */
  private String itemName;

  /**
   * 物品价格
   */
  private Double itemPrice;

  /**
  *  添加人编号
  */
  private String addUserId;

  /**
  *  添加时间
  */
  private Date addTime;

}

前端提交的JSON数据:

<script>

var submitData = {
  "id":"361E8C48-6699-4ED5-83C4-7C9D98747C2C",
  "itemName":"iPhone 8 Plus"
  "itemPrice":""
};

</script>

Service 实现类 更新方法:

@Service
@Slf4j
public class ShopItemServiceImpl extends ServiceImpl<ShopItemMapper, ShopItem> implements IShopItemService {

  @Override
  public ResultVO updateShopItemData(ShopItem shopItem) {
    try {
      this.baseMapper.updateById(shopItem);
    } catch (Exception e) {
      log.error("修改商品数据时异常:{}",e.getMessage());
      return ResultVO.builder().success(false).build();
    }
    return ResultVO.builder().success(true).build();
  }

}

在执行 updateShopItemData()方法时,通过Mybatis Log插件控制台可以看见日志如下:

update
  shop_item
set
  item_name = 'iPhone 8 Plus'
where
id = '361E8C48-6699-4ED5-83C4-7C9D98747C2C';

发现itemPrice字段未加入SQL语句的set关键字后!Σ(⊙▽⊙"a

沉思了几分钟,想起以前使用原生Mybatis生成的Update方法,是有对值是否为空的判断,如果为空就不加入到update table set语句内,于是将问题重心移到Mybatis Plus文档内,看看是不是会有类似于@TableField、@TableId这样的注解,能解决该问题呢?

解决方案

先放链接:点我进入官方文档@TableField

查阅文档的思路是,我们项目内的这个列是字段,而非主键,所以首先排除@TableId注解,直接进入@TableField注解的相关内容。

在该注解的属性描述内,有这样一个字段——“fill”,字段自动填充策略。

fill Enum FieldFill.DEFAULT 字段自动填充策略

他决定了在执行新增或修改方法时,有这个注解的字段需要怎样将数据进行填充,FieldFill的相关的属性,官方描述如下:

描述
DEFAULT 默认不处理
INSERT 插入时填充字段
UPDATE 更新时填充字段
INSERT_UPDATE 插入和更新时填充字段

默认值是DEFAULT,默认不处理,即上文出现的问题——新增、修改该字段为空时,将不自动填充即不列入语句,如:

insert into shop_item(shop_price) values(xxxx);

update shop_item set shop_price = xxxx;

OK,解决方案找到了,让我们来修改实体类吧!

@Data
@TableName("shop_item")
public class ShopItem implements Serializable {

   private static final long serialVersionUID = 1L;

  /**
   * 编号
   */
  @TableId(type= IdType.INPUT)
  private String id;

  /**
   * 物品名称
   */
  private String itemName;

  /**
   * 物品价格
   */
  @TableField(fill = FieldFill.UPDATE)
  private Double itemPrice;

  /**
  *  添加人编号
  */
  private String addUserId;

  /**
  *  添加时间
  */
  private Date addTime;

}

我们在itemPrice属性的顶上加上@TableField(fill = FieldFill.UPDATE)后,在执行一遍修改方法看看!

update
  shop_item
set
  item_name = 'iPhone 8 Plus',

  item_price = ''
where
id = '361E8C48-6699-4ED5-83C4-7C9D98747C2C';

bingo,成功!

(0)

相关推荐

  • SpringBoot Mybatis Plus公共字段自动填充功能

    一.应用场景 平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦.mybatisPlus有一个很好的解决方案.也就是公共字段自动填充的功能.一般满足下面条件的字段就可以使用此功能: 这个字段是大部分表都会有的. 这个字段的值是固定的,或则字段值是可以在后台动态获取的. 常用的就是last_update_time,last_update_name这两个字段. 二.配置MybatisPlus 导包:

  • Mybatis-Plus3.2.0 MetaObjectHandler 无法进行公共字段全局填充

    问题描述 最近在做的这个项目架构组对于配置文件决定,采取的是 .xml 配置文件 一个数据中台项目,因为部署环境比较复杂,可能需要适配阿里.腾讯.开源等环境和机房,所以配置文件和启动类为三类 之前写的 MetaObjectHandler 都是采用的 SpringBoot 配置方式开发,突然换成 .xml 配置文件,还是有不少坑的,其中就有配置的 MetaObjectHandler 死活不起作用 ⬆️

  • Mybatis Plus 字段为空值时执行更新方法未更新解决方案

    问题描述 系统测试过程中,同事测试出使用Mybatis Plus提供的封装方法UpdateById()时,字段从前台传入的数据为空值,但是执行方法后该字段未得到更新. 问题重现 因涉及到公司层面的模型.数据,本文都为测试模型和例子. 实体类: @Data @TableName("shop_item") public class ShopItem implements Serializable { private static final long serialVersionUID =

  • java如何实现项目启动时执行指定方法

    本文实例为大家分享了java项目启动时执行指定方法,供大家参考,具体内容如下 想到的就是监听步骤如下: 1.配置web.xml <listener> <listener-class>com.listener.InitListener</listener-class> </listener> 2.编写InitListener类 package com.listener; import java.io.File; import javax.servlet.Ser

  • 详解Vue.js在页面加载时执行某个方法

    jQuery中可以这样写 vue中,如果要达到相同效果,可以使用vue的生命周期函数,如create或者mounted 附上vue.js的生命周期函数执行流程 总结 以上所述是小编给大家介绍的Vue.js在页面加载时执行某个方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • 详解Spring Boot 项目启动时执行特定方法

    Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRunner. 这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方法.我们可以通过实现ApplicationRunner和CommandLineRunner,来实现,他们都是在SpringApplication 执行之后开始执行的. CommandLineRunner接口可以用来接收字符串数组的命令行参数,ApplicationRunner 是使用App

  • 提交表单时执行func方法实现代码

    复制代码 代码如下: <%@ page contentType="text/html; charset=utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://ww

  • 使用Mybatis更新时候只更新变更部分的方法

    目录 Mybatis更新时候只更新变更部分 具体可以参考以下代码 Mybatis update更新字段的使用 多个mapper方法,更新单字段 通用mapper方法,java代码控制字段 特别注意,定位字段不要加if Mybatis更新时候只更新变更部分 在更新数据库的某条记录的时候,通过我们只需要更新我们设置的字段就可以了,但是如果基于ORM映射更新,当参数传入的为一个Bean的时候,这个时候会将Bean的全部字段都更新一次. 有一个场景的如在登陆时候,如果用户登陆成功以后只想更新用户登陆的i

  • Mybatis-Plus中updateById方法不能更新空值问题解决

    目录 问题描述 演示: 原因分析: 解决方案: 1.设置字段级别的更新策略IGNORED 2.设置全局更新策略IGNORED 3.采用alwaysUpdateSomeColumnById方法进行全字段更新 小结: 问题描述 在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的.而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况.那么如果让Mybatis-Plus中的updateById方法支持空值更新呢? 演示: 实体User: @Table

  • PostgreSQL更新表时时间戳不会自动更新的解决方法

    PostgreSQL更新表时时间戳不会自动更新的解决方法,具体如下 操作系统:CentOS7.3.1611_x64 PostgreSQL版本:9.6 问题描述 PostgreSQL执行Insert语句时,自动填入时间的功能可以在创建表时实现,但更新表时时间戳不会自动自动更新. 在mysql中可以在创建表时定义自动更新字段,比如 : create table ab ( id int, changetimestamp timestamp NOT NULL default CURRENT_TIMEST

  • Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办

    项目开发中,在做Mybatis动态查询时,遇到了一个问题:MySQL在进行LIKE模糊查询时,输入英文可以正常检索出结果,但是输入中文后检索得到的结果为空. 由于是使用GET方式请求,所以为了确保中文不乱码,在控制台接收到请求参数后,对中文进行了一次编码. try { realName = new String(realName.getBytes("GBK"), "UTF-8"); } catch (UnsupportedEncodingException exce

  • mysql 记录不存在时插入 记录存在则更新的实现方法

    mysql 记录不存在时插入在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案. 问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢? 答案:可以通过使用 EXISTS 条件句防止插入重复记录. 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的

随机推荐