公家网站模板,wordpress搜索用户,网站建设客户分析调查表,厦门网络公司的网络平台一个bug
在一个管理页面#xff0c;有一个非必填字段被设置成空了并提交更新#xff0c;再次打开的时候#xff0c;发现字段还在#xff0c;并没有被更新成功。 使用的数据库映射框架是 Mybatis-plus #xff0c;对于Mybatis 在更新字段的时候会对空进行校验#xff0c;…一个bug
在一个管理页面有一个非必填字段被设置成空了并提交更新再次打开的时候发现字段还在并没有被更新成功。 使用的数据库映射框架是 Mybatis-plus 对于Mybatis 在更新字段的时候会对空进行校验如果字段为 null会被忽略加入 sql。
应对策略
推荐策略使用 UpdateWrapper (3.x)
使用 UpdateWrapper 或 LambdaUpdateWrapper
这是官方给出的案例
//updateAllColumnById(entity) // 全部字段更新: 3.0已经移除
mapper.update(new User().setName(mp).setAge(3),Wrappers.UserlambdaUpdate().set(User::getEmail, null) //把email设置成null.eq(User::getId, 2)
);
//也可以参考下面这种写法
mapper.update(null,Wrappers.UserlambdaUpdate().set(User::getAge, 3).set(User::getName, mp).set(User::getEmail, null) //把email设置成null.eq(User::getId, 2)
);
通过这种方式可以达到将字段设置成 null 的效果。 其他策略不推荐并且慎用
在字段上增加了 TableField(updateStrategy FieldStrategy.IGNORED)
在 DO 字段上添加这个更新策略就是不会判断 null任何时候都加入 sql
特别注意这个策略在高级版本中已经被 deprecated 3.5.3.2 更新丢失风险 FieldStrategy.ALWAYS
意味着在每次更新操作中都会将实体对象中的所有字段值写入数据库无论这些字段的值是否为 null
风险巨大。
有一张用户表 在 salary 上添加 FieldStrategy.ALWAYS
(id,name,age,salary)
开发A通过 id 更新 age 但是 DO 没有设置 salary了mybaits-plus 会添加 salary 最终导致 salary 被更新为 null导致数据丢失。 这种问题如果不注意后果十分严重不建议在 DO 上添加此策略。随着业务发展人员变动这种操作会给以后埋下隐患。 另外使用这种策略以后对于批量更新简直噩梦慎重 自定义 sql 方式
如果需要更复杂的逻辑来决定何时将字段设置为 null可以选择编写自定义的 XML 映射文件或者使用 Select, Update 等注解来定义 SQL 语句在其中明确写出 SET column_name NULL 其他策略(“曲线救国”)
如果是 String 类型可以设置成“”例如 MapStruct 设置一个默认值。
Mappings({Mapping(source name, target name, defaultValue )
})
UpdateParam convert(Request request); 结束
谨慎使用策略 FieldStrategy.ALWAYS/ FieldStrategy.IGNORED更新使用 UpdateWrapper 或 LambdaUpdateWrapper