MybatisPlus中updateById方法不能更新空值如何解决 |
您所在的位置:网站首页 › mybatisplus中的查询方法可以给空吗 › MybatisPlus中updateById方法不能更新空值如何解决 |
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()); }执行结果: 可以看到由于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; }再次执行上面的单元测试: 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()); }执行结果: 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()); }执行结果: 虽然没有修改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 |