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,成功!