欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-01 19:05:35
问题描述系统测试过程中,同事测试出使用mybatis plus提供的封装方法updatebyid()时,字段从前台传入的数据为空值,但是执行方法后该字段未得到更新。问题重现因涉及到公司层面的模型、数据...

问题描述

系统测试过程中,同事测试出使用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,成功!