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_asetcolumn=#{columnProperty}
*NOT_EMPTY:updatetable_asetcolumn=#{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"";
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。