原因
因为 MyBatis-Plus 自带的更新方法,都有对对象空值进行判空。只有不为空的字段才会进行数据更新。
解决方式
在实体类对应的字段上加注解@TableField(strategy=FieldStrategy.IGNORED),忽略null值的判断,例如:
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String address;
示例:
1、未加注解(无法设入空值,见代码结果):
//实体private String address;
@Test
public void updateUserTest(){
User user = new User();
user.setId(1);
user.setState((byte) 1);
user.setAddress(null);
userService.updateById(user);
}
//结果
==> Preparing: UPDATE user SET state=? WHERe id=?
==> Parameters: 1(Byte), 1(Integer)
2、加注解(可以设入空值,看代码结果)
//实体@TableField(updateStrategy = FieldStrategy.IGNORED)
private String address;
@Test
public void updateUserTest(){
User user = new User();
user.setId(1);
user.setState((byte) 1);
user.setAddress(null);
userService.updateById(user);
}
//结果
==> Preparing: UPDATE user SET address=?, state=? WHERe id=?
==> Parameters: null, 1(Byte), 1(Integer)
3、直接使用 UpdateWrapper
@Test
public void updateUserTest(){
UpdateWrapper userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper.set("address", null);
userUpdateWrapper.lambda().eq(User::getId, 1);
userService.update(userUpdateWrapper);
}
//结果
==> Preparing: UPDATE user SET address=? WHERe (id = ?)
==> Parameters: null, 1(Integer)
附上 MyBatis-Plus 表字段标识 注解类
@documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TableField {
String value() default "";
boolean exist() default true;
String condition() default "";
String update() default "";
FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;
FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;
FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;
FieldFill fill() default FieldFill.DEFAULT;
boolean select() default true;
boolean keepGlobalFormat() default false;
JdbcType jdbcType() default JdbcType.UNDEFINED;
Class extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
String numericScale() default "";
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



