当前位置: 移动技术网 > IT编程>开发语言>Java > Mybatis Plus 字段为空值时执行更新方法未更新解决方案

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

2020年09月03日  | 移动技术网IT编程  | 我要评论
问题描述系统测试过程中,同事测试出使用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,成功!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网