MybatisPlus中updateById方法不能更新空值如何解决

您所在的位置:网站首页 mybatisplus中的查询方法可以给空吗 MybatisPlus中updateById方法不能更新空值如何解决

MybatisPlus中updateById方法不能更新空值如何解决

2023-03-28 11:31| 来源: 网络整理| 查看: 265

MybatisPlus中updateById方法不能更新空值如何解决 发布时间:2022-08-11 11:29:51 来源:亿速云 阅读:771 作者:iii 栏目:开发技术

这篇文章主要介绍了MybatisPlus中updateById方法不能更新空值如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus中updateById方法不能更新空值如何解决文章都会有所收获,下面我们一起来看看吧。

问题描述

在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的。而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况。那么如果让Mybatis-Plus中的updateById方法支持空值更新呢?

演示:

实体User:

@TableName(value ="user") @Data public class User implements Serializable {     @TableId(value = "id",type = IdType.ASSIGN_ID)     private Long id;     private String name;     private Integer age;     private String email; }

updateById方法单元测试:

    @Test     public void testUpdateById() {         System.out.println("----- updateById method test ------");         User user = new User();         user.setId(1543920054188400641L);         user.setName("test");         user.setAge(13);         //user.setEmail();         userMapper.updateById(user);         System.out.println(user.toString());     }

执行结果:

MybatisPlus中updateById方法不能更新空值如何解决

可以看到由于email字段的值为null,所以执行updateById方法时没有对email字段进行更新。

原因分析:

Mybatis-Plus中字段的更新策略是通过FieldStrategy属性控制的。

在实体字段上,如果不通过@TableField注解指定字段的更新策略,字段默认的更新策略是FieldStrategy.DEFAULT,即跟随全局策略。

而Mybatis-Plus的全局配置中,字段的默认更新策略是FieldStrategy.NOT_NULL,即进行空值判断,不对NULL值数据进行处理。

public DbConfig() {     this.idType = IdType.ASSIGN_ID;     this.tableUnderline = true;     this.capitalMode = false;     this.logicDeleteValue = "1";     this.logicNotDeleteValue = "0";     this.insertStrategy = FieldStrategy.NOT_NULL;     this.updateStrategy = FieldStrategy.NOT_NULL;     this.whereStrategy = FieldStrategy.NOT_NULL; }解决方案:1、设置字段级别的更新策略IGNORED

如果只需要实体中的几个字段支持空值更新,则通过@TableField注解指定字段的更新策略为FieldStrategy.IGNORED,忽略空值判断,直接更新即可。该方式的控制级别是字段级别的控制。

实体User:

@TableName(value ="user") @Data public class User implements Serializable {     @TableId(value = "id",type = IdType.ASSIGN_ID)     private Long id;     private String name;     private Integer age;     @TableField(updateStrategy = FieldStrategy.IGNORED)     private String email; }

再次执行上面的单元测试:

MybatisPlus中updateById方法不能更新空值如何解决

email字段虽然是空值,但仍然进行了更新操作,说明此时email字段已经支持空值更新。

2、设置全局更新策略IGNORED

如果需要全局所有实体的更新操作都需要支持空值更新,可以修改Mybatis-Plus的全局更新策略。该方式的控制级别是项目级别的控制。

在spring boot中修改如下属性即可:

mybatis-plus.global-config.db-config.update-strategy=ignored

测试:实体User:

@TableName(value ="user") @Data public class User implements Serializable {     @TableId(value = "id",type = IdType.ASSIGN_ID)     private Long id;     private String name;     private Integer age;     private String email; }

单元测试:

@Test public void testUpdateById() {     System.out.println("----- updateById method test ------");     User user = new User();     user.setId(1543920054188400641L);     user.setName("test");     //user.setAge(13);     //user.setEmail();     userMapper.updateById(user);     System.out.println(user.toString()); }

执行结果:

MybatisPlus中updateById方法不能更新空值如何解决

age和email字段都支持空值更新,说明全局更新策略ignored生效。

3、采用alwaysUpdateSomeColumnById方法进行全字段更新

Mybatis-Plus中自带的扩展方法alwaysUpdateSomeColumnById会忽略字段的更新策略,直接对实体中的每一个字段都执行更新操作。如果你不想修改全局的字段更新策略,又需要项目中某个实体的所有字段都支持空值更新,推荐采用该方法。该方式的控制级别是实体级别的控制。

实现步骤:

1、继承DefaultSqlInjector扩展sql注入器,注入AlwaysUpdateSomeColumnById方法

public class MySqlInjector extends DefaultSqlInjector {     @Override     public List getMethodList(Class mapperClass, TableInfo tableInfo) {         List methodList = super.getMethodList(mapperClass,tableInfo);         //自动填充策略为更新填充策略时,不用插入值         methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));         //自动填充策略为插入时自动填充时,字段不用更新         methodList.add(new AlwaysUpdateSomeColumnById(i -> i.getFieldFill() != FieldFill.INSERT));         return methodList;     } }

2、将扩展的sql注入器配置到spring容器中

@Configuration public class MybatisPlusConfig {     @Bean     public MySqlInjector sqlInjector() {         return new MySqlInjector();     } }

3、扩展自己的通用Mapper接口CommonMapper

public interface CommonMapper extends BaseMapper {     /**      * 全量插入,等价于insert      * @param entityList      * @return      */     int insertBatchSomeColumn(List entityList);     /**      * 全字段更新,不会忽略null值      * @param entity      * @return      */     int alwaysUpdateSomeColumnById(@Param("et") T entity); }

4、UserMapper继承自定义的CommonMapper

public interface UserMapper extends CommonMapper { }

5、实体User

@TableName(value ="user") @Data public class User implements Serializable {     @TableId(value = "id",type = IdType.ASSIGN_ID)     private Long id;     private String name;     private Integer age;     private String email; }

6、单元测试

    @Test     public void testUpdateById() {         System.out.println("----- updateById method test ------");         User user = new User();         user.setId(1543920054188400641L);         user.setName("test");         user.setAge(13);         //user.setEmail();         userMapper.alwaysUpdateSomeColumnById(user);         System.out.println(user.toString());     }

执行结果:

MybatisPlus中updateById方法不能更新空值如何解决

虽然没有修改Mybatis-Plus全局的更新策略,也没有在实体字段上使用@TableField注解修改字段的更新策略,但是alwaysUpdateSomeColumnById方法仍然可以对空值字段进行更新。

小结:

本文主要是对Mybatis-Plus中updateById方法不能更新空值问题进行了分析说明,并提供了3种解决方案。

字段级别解决方案采用@TableField注解修改字段默认的更新策略为FieldStrategy.IGNORED。

   @TableField(updateStrategy = FieldStrategy.IGNORED)    private String email;

实体级别解决方案调用Mybatis-Plus中的扩展方法alwaysUpdateSomeColumnById,忽略字段更新策略,直接对实体中所有字端进行更新。

全局级别解决方案修改Mybatis-Plus的全局更新策略为ignored

mybatis-plus.global-config.db-config.update-strategy=ignored

关于“MybatisPlus中updateById方法不能更新空值如何解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“MybatisPlus中updateById方法不能更新空值如何解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读: 在python3中检测空值的方法 python表示空值的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mybatisplus updatebyid 上一篇新闻:python-memcached在python3.8环境中报SyntaxWarning如何修复 下一篇新闻:element中el-cascader如何使用 猜你喜欢 PHP获取2个时间点之间的年月 一个胖子的paython之路(1) 解决Flink反压的方法有哪些? CAD显示图层(网页版) 「Protocol_Buffer」之基本使用与格式定义 Ribbon如何负载均衡地消费microservice-provider-user composer出现404错误 如何理解Angular服务 Angular 文档中链接的修改路径 如何在java中调用kotlin代码


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3