MyBatis Plus更新对象无法设空值解决方案

网友投稿 794 2022-11-12


MyBatis Plus更新对象无法设空值解决方案

原因

因为 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 = http://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 表字段标识 注解类

/**

* 表字段标识

*

* @author hubin sjy tantan

* @since 2016-09-09

*/

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface TableField {

/**

* 字段值(驼峰命名方式,该值可无)

*/

String value() default "";

/**

* 是否为数据库表字段

* 默认 true 存在,false 不存在

*/

boolean exist() default true;

/**

* 字段 where 实体查询比较条件

* 默认 `=` 等值

*/

String condition() default "";

/**

* 字段 update set 部分注入, 该注解优于 el 注解使用

*

* 例1:@TableField(.. , update="%s+1") 其中 %s 会填充为字段

* 输出 SQL 为:update 表 set 字段=字段+1 where ...

*

* 例2:@TableField(.. , update="now()") 使用数据库时间

* 输出 SQL 为:update 表 set 字段=now() where ...

*/

String update() default "";

/**

* 字段验证策略之 insert: 当insert操作时,该字段拼接insert语句时的策略

* IGNORED: 直接拼接 insert into table_a(column) values (#{columnProperty});

* NOT_NULL: insert into table_a(column) values (#{columnProperty})

* NOT_EMPTY: insert into table_a(column) values (#{columnProperty})

*

* @since 3.1.2

*/

FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;

/**

* 字段验证策略之 update: 当更新操作时,该字段拼接set语句时的策略

* IGNORED: 直接拼接 update table_a set column=#{columnProperty}, 属性为null/空string都会被set进去

* NOT_NULL: update table_a set column=#{columnProperty}

* NOT_EMPTY: update table_a set column=#{columnProperty}

*

* @since 3.1.2

*/

FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;

/**

* 字段验证策略之 where: 表示该字段在拼接where条件时的策略

* IGNORED: 直接拼接 column=#{columnProperty}

* NOT_NULL: column=#{columnProperty}

* NOT_EMPTY: column=#{columnProperty}

*

* @since 3.1.2

*/

FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;

/**

* 字段自动填充策略

*/

FieldFill fill() default FieldFill.DEFAULT;

/**

* 是否进行 select 查询

*

大字段可设置为 false 不加入 select 查询范围

*/

boolean select() default true;

/**

* 是否保持使用全局的 Format 的值

*

只生效于 既设置了全局的 Format 也设置了上面 {@link #value()} 的值

*

*

* @since 3.1.1

*/

boolean keepGlobalFormat() default false;

/**

*YdIiRvi JDBC类型 (该默认值不代表会按照该值生效)

*

* {@link ResultMapping#jdbcType} and {@link ParameterMapping#jdbcType}

*

* @since 3.1.2

*/

JdbcType jdbcType() default JdbcType.UNDEFINED;

/**

* 类型处理器 (该默认值不代表会按照该值生效)

*

* {@link ResultMapping#typeHandler} and {@link ParameterMapping#typeHandler}

*

* @since 3.1.2

*/

Class extends TypeHandler> typeHandler() default UnknownTypeHandler.class;

/**

* 指定小数点后保留的位数

*

* {@YdIiRvilink ParameterMapping#numericScale}

*

* @since 3.1.2

*/

String numericScale() default "";

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解IDEA社区版(Community)和付费版(UItimate)的区别
下一篇:spring boot拦截器注入不了java bean的原因
相关文章

 发表评论

暂时没有评论,来抢沙发吧~