背景
在项目过程中,信息的录入有个需要是有联动效果的,比如,录入用户信息时,如果性别选择女,则需要填入是否生育,如果是男,则没有。如果有用户先选择了性别女,录入了已经生育字段信息,然后又把性别改成了男,这样数据库的字段就会变成,性别男,已生育这样的奇怪组合,因此,需要把是否生育字段的值改成空值,当然以上例子并不十分准确,但是类似的场景比比皆是。
问题
项目使用的持久层框架是mybatis-plus,正常来说mybatis-plus是有空值判断,如果更新的对象(比如UserDO)中某个值为空,mybatis-plus会认为该值不需要更新,而不是把它更新为空。
解决方法
- 使用注解
在需要更新的字段上面加上注解@TableField(strategy = FieldStrategy.IGNORED),这样mybatis-plus就会在当前字段为空值时,更新为null,这样处理方式比较简单,全局有效,但是引起的问题,如果在某次更新中确实是不用更新该字段,所有并没有给该字段赋值,而不是想把它更新为null,但是mybatis-plus依然会把它更新为null,应对的方式有两种,一是使用自定义的更新语句,一是每次更新时,从数据库查询出原信息,然后set需要更新的新值,但是在多人团队中,是很难保证这点的。
- 使用UpdateWrapper条件构造器
官网对于UpdateWrapper的讲述如下,个人感觉不是很详细,作了部分补,见图2。
当需要更新的字段比较少时,userMapper.update(userDO, updateWrapper)可以直接传userMapper.update(null, updateWrapper);将需要更新的字段通过updateWrapper的set类设置,updateWrapper的eq后面的字段为本次更新的条件。