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

更新时间:2023-05-20 22:40:08 阅读: 评论:0

解决MyBatis-Plus更新对象⽆法设空值原因
因为 MyBatis-Plus ⾃带的更新⽅法,都有对对象空值进⾏判空。只有不为空的字段才会进⾏数据更新。
解决⽅式
扎西德勒在实体类对应的字段上加注解@TableField(strategy=FieldStrategy.IGNORED),忽略null值的判断,例如:
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String address;
⽰例:
1、未加注解(⽆法设⼊空值,见代码结果):
//实体
private String address;
@Test
public void updateUrTest(){
Ur ur = new Ur();
青椒ur.tId(1);
ur.tState((byte) 1);
ur.tAddress(null);
urService.updateById(ur);
}
//结果
毛相林事迹==> Preparing: UPDATE ur SET state=? WHERE id=?
==> Parameters: 1(Byte), 1(Integer)
2、加注解(可以设⼊空值,看代码结果)
/
/实体
猪的照片可爱@TableField(updateStrategy = FieldStrategy.IGNORED)
private String address;
@Test
public void updateUrTest(){
Ur ur = new Ur();
ur.tId(1);
ur.tState((byte) 1);
ur.tAddress(null);
urService.updateById(ur);
}
/
/结果
==>  Preparing: UPDATE ur SET address=?, state=? WHERE id=?
==> Parameters: null, 1(Byte), 1(Integer)
ps:注意配置⽂件中 mybatis-plus 中update-strategy 配置
#mybatis
mybatis-plus:
mapper-locations: classpath*:/mapper/**/**.xml
#实体扫描,多个package⽤逗号或者分号分隔
typeAliasPackage: **.entity
global-config:
#数据库相关配置
db-config:
#      lect-strategy: not_empty
#      inrt-strategy: not_empty
update-strategy: not_empty
#主键类型  AUTO:"数据库ID⾃增", INPUT:"⽤户输⼊ID", ID_WORKER:"全局唯⼀ID (数字类型唯⼀ID)", UUID:"全局唯⼀ID UUID";
id-type: ID_WORKER
banner: fal
ignored  不管有没有有设置属性,所有的字段都会设置到inrt语句中,如果没设置值,全为null,这种在update 操作中会有风险,把有值的更新为null not_null,也是默认策略,也就是忽略null的字段,不忽略""
not-empty  为null,为空串的忽略,就是如果设置值为null,“”,不会插⼊数据库
3、直接使⽤ UpdateWrapper
@Test
public void updateUrTest(){
UpdateWrapper<Ur> urUpdateWrapper = new UpdateWrapper<>();
urUpdateWrapper.t("address", null);
urUpdateWrapper.lambda().eq(Ur::getId, 1);
urService.update(urUpdateWrapper);
}
//结果
==>  Preparing: UPDATE ur 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 存在,fal 不存在
*/
boolean exist() default true;
/**
* 字段 where 实体查询⽐较条件
重载和重写的区别
* 默认 `=` 等值
*/
String condition() default "";
/**
* 字段 update t 部分注⼊, 该注解优于 el 注解使⽤
* <p>
* 例1:@TableField(.. , update="%s+1") 其中 %s 会填充为字段
* 输出 SQL 为:update 表 t 字段=字段+1 where ...
* <p>
* 例2:@TableField(.. , update="now()") 使⽤数据库时间
* 输出 SQL 为:update 表 t 字段=now() where ...
*/
String update() default "";
/**
* 字段验证策略之 inrt: 当inrt操作时,该字段拼接inrt语句时的策略
* IGNORED: 直接拼接 inrt into table_a(column) values (#{columnProperty});
* NOT_NULL: inrt into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
* NOT_EMPTY: inrt into table_a(<if test="columnProperty != null and columnProperty!=''">column</if>) values (<if test="columnProperty != null and columnProperty!=''">#{columnProperty}</if>)    *
旅游的英语* @since 3.1.2
*/
FieldStrategy inrtStrategy() default FieldStrategy.DEFAULT;
/**
* 字段验证策略之 update: 当更新操作时,该字段拼接t语句时的策略
* IGNORED: 直接拼接 update table_a t column=#{columnProperty}, 属性为null/空string都会被t进去
* NOT_NULL: update table_a t <if test="columnProperty != null">column=#{columnProperty}</if>
* NOT_EMPTY: update table_a t <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
*
* @since 3.1.2
*/
FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;
/**
* 字段验证策略之 where: 表⽰该字段在拼接where条件时的策略
* IGNORED: 直接拼接 column=#{columnProperty}
* NOT_NULL: <if test="columnProperty != null">column=#{columnProperty}</if>
* NOT_EMPTY: <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
*
* @since 3.1.2
*/
FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;
/**
* 字段⾃动填充策略
*/
FieldFill fill() default FieldFill.DEFAULT;
/**
* 是否进⾏ lect 查询
* <p>⼤字段可设置为 fal 不加⼊ lect 查询范围</p>
*/
boolean lect() default true;
/**
* 是否保持使⽤全局的 Format 的值
* <p> 只⽣效于既设置了全局的 Format 也设置了上⾯ {@link #value()} 的值 </p>    * <li> 如果是 fal , 全局的 Format 不⽣效 </li>
*
* @since 3.1.1
*/
boolean keepGlobalFormat() default fal;
/**
* JDBC类型 (该默认值不代表会按照该值⽣效)
* <p>
* {@link ResultMapping#jdbcType} and {@link ParameterMapping#jdbcType}
*
* @since 3.1.2
*/三峡大学电气
JdbcType jdbcType() default JdbcType.UNDEFINED;
/
**
* 类型处理器 (该默认值不代表会按照该值⽣效)
* <p>
* {@link ResultMapping#typeHandler} and {@link ParameterMapping#typeHandler}    *
* @since 3.1.2
*/
Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class; /**
* 指定⼩数点后保留的位数
* <p>
* {@link ParameterMapping#numericScale}
浙江乌镇在哪个市
*
* @since 3.1.2
*/
String numericScale() default "";
}

本文发布于:2023-05-20 22:40:08,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/712525.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字段   设置   数据库   策略   类型
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图