MyBatis Plus更新对象无法设空值解决方案
原因
因为MyBatis-Plus自带的更新方法,都有对对象空值进行判空。只有不为空的字段才会进行数据更新。
解决方式
在实体类对应的字段上加注解@TableField(strategy=FieldStrategy.IGNORED),忽略null值的判断,例如:
@TableField(updateStrategy=FieldStrategy.IGNORED)
privateStringaddress;
示例:
1、未加注解(无法设入空值,见代码结果):
//实体privateStringaddress; @Test publicvoidupdateUserTest(){ Useruser=newUser(); user.setId(1); user.setState((byte)1); user.setAddress(null); userService.updateById(user); } //结果 ==>Preparing:UPDATEuserSETstate=?WHEREid=? ==>Parameters:1(Byte),1(Integer)
2、加注解(可以设入空值,看代码结果)
//实体@TableField(updateStrategy=FieldStrategy.IGNORED) privateStringaddress; @Test publicvoidupdateUserTest(){ Useruser=newUser(); user.setId(1); user.setState((byte)1); user.setAddress(null); userService.updateById(user); } //结果 ==>Preparing:UPDATEuserSETaddress=?,state=?WHEREid=? ==>Parameters:null,1(Byte),1(Integer)
3、直接使用UpdateWrapper
@Test publicvoidupdateUserTest(){ UpdateWrapperuserUpdateWrapper=newUpdateWrapper<>(); userUpdateWrapper.set("address",null); userUpdateWrapper.lambda().eq(User::getId,1); userService.update(userUpdateWrapper); } //结果 ==>Preparing:UPDATEuserSETaddress=?WHERE(id=?) ==>Parameters:null,1(Integer)
附上MyBatis-Plus表字段标识注解类
/** *表字段标识 * *@authorhubinsjytantan *@since2016-09-09 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public@interfaceTableField{ /** *字段值(驼峰命名方式,该值可无) */ Stringvalue()default""; /** *是否为数据库表字段 *默认true存在,false不存在 */ booleanexist()defaulttrue; /** *字段where实体查询比较条件 *默认`=`等值 */ Stringcondition()default""; /** *字段updateset部分注入,该注解优于el注解使用 **例1:@TableField(..,update="%s+1")其中%s会填充为字段 *输出SQL为:update表set字段=字段+1where... *
*例2:@TableField(..,update="now()")使用数据库时间 *输出SQL为:update表set字段=now()where... */ Stringupdate()default""; /** *字段验证策略之insert:当insert操作时,该字段拼接insert语句时的策略 *IGNORED:直接拼接insertintotable_a(column)values(#{columnProperty}); *NOT_NULL:insertintotable_a(
column)values( #{columnProperty}) *NOT_EMPTY:insertintotable_a( column)values( #{columnProperty}) * *@since3.1.2 */ FieldStrategyinsertStrategy()defaultFieldStrategy.DEFAULT; /** *字段验证策略之update:当更新操作时,该字段拼接set语句时的策略 *IGNORED:直接拼接updatetable_asetcolumn=#{columnProperty},属性为null/空string都会被set进去 *NOT_NULL:updatetable_aset column=#{columnProperty} *NOT_EMPTY:updatetable_aset column=#{columnProperty} * *@since3.1.2 */ FieldStrategyupdateStrategy()defaultFieldStrategy.DEFAULT; /** *字段验证策略之where:表示该字段在拼接where条件时的策略 *IGNORED:直接拼接column=#{columnProperty} *NOT_NULL: column=#{columnProperty} *NOT_EMPTY: column=#{columnProperty} * *@since3.1.2 */ FieldStrategywhereStrategy()defaultFieldStrategy.DEFAULT; /** *字段自动填充策略 */ FieldFillfill()defaultFieldFill.DEFAULT; /** *是否进行select查询 * 大字段可设置为false不加入select查询范围
*/ booleanselect()defaulttrue; /** *是否保持使用全局的Format的值 *只生效于既设置了全局的Format也设置了上面{@link#value()}的值
*如果是false,全局的Format不生效 * *@since3.1.1 */ booleankeepGlobalFormat()defaultfalse; /** *JDBC类型(该默认值不代表会按照该值生效) **{@linkResultMapping#jdbcType}and{@linkParameterMapping#jdbcType} * *@since3.1.2 */ JdbcTypejdbcType()defaultJdbcType.UNDEFINED; /** *类型处理器(该默认值不代表会按照该值生效) *
*{@linkResultMapping#typeHandler}and{@linkParameterMapping#typeHandler} * *@since3.1.2 */ ClasstypeHandler()defaultUnknownTypeHandler.class; /** *指定小数点后保留的位数 *
*{@linkParameterMapping#numericScale} * *@since3.1.2 */ StringnumericScale()default""; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。