项目:前端vue+后台java项目

数据库:默认是null,不是""

遇到的问题:使用elementUI的下拉框、treeSelect等控件删除一个对象的某些属性,之后无法成功更新“删除”掉这些数据

mybatis默认更新规则是不更新属性为null的属性的。

一般情况下遇到的一个问题就是:只能改属性,删不掉属性。

从安全、性能角度考虑确实需要这样,但是如果一张表有多重数据入口,比如可以在多个页面操作修改含有同一个表的数据,就必须得查出来所有字段,会影响一部分性能,另外项目迭代、连表查询时也容易丢失某些字段导致更新时update成null

公司同事建议用不同的dto,然后给这些dto设置成默认全部更新去解决,楼主认为这样又会产生大量dto+mapper文件,服务层也需要注入大量类似名称的mapper,不算一个通用的方法

经过测试发现前端的这些空间点击clear会将属性变成undefined,前端传给后台时如果该属性是undefined就不会传递,但是如果是null就会传递

楼主的解决方案:前端封装控件,传递属性为null的属性,后台用jsonObect接收参数,通过updateWrapper和class反射机制产生一个updatewapper对象,之后mapper用wrapper去更新。

这里以treeSelect为例,在它的外部又套了一层,在这里对undefined的情况下进行判断,设置成了null。

后台接口就这样写一下,更新部分用update方法代替了之前的

生成wrapper的部分大概就是这样的遍历就行了,这里只有一种date情况,到未来可能有很多类型需要判断,到时候可以再用设计模式优化一下。

public static <E> UpdateWrapper setUpdateWrapper(E e, JSONObject object) throws Exception{UpdateWrapper<E> updateWrapper = new UpdateWrapper<E>();List<Field> fields = ReflectUtils.getAllFields(e.getClass(), new ArrayList<>());if (object != null) {String name=null;//java字段名String value=null;//数据库名for (Field field : fields) {boolean accessible = field.isAccessible();field.setAccessible(true);TableId tableId = field.getAnnotation(TableId.class);TableField tableField = field.getAnnotation(TableField.class);Class<?> type = field.getType();if (tableId!=null){name = field.getName();value = tableId.value();if (object.containsKey(name)&&StringUtils.isNotBlank(value)){if (type== Date.class){Object o = object.get(name);Long aLong = new Long(object.get(name).toString());Date date = new Date(aLong);String dateStr = DateUtil.dateFormat(date);updateWrapper.set(value,dateStr);}updateWrapper.eq(value,object.get(name));}}if (tableField!=null){name = field.getName();value = tableField.value();if (object.containsKey(name)&&StringUtils.isNotBlank(value)){if (type== Date.class){Object o = object.get(name);Long aLong = new Long(object.get(name).toString());Date date = new Date(aLong);String dateStr = DateUtil.dateFormat(date);updateWrapper.set(value,dateStr);}else{updateWrapper.set(value,object.get(name));}}}}}return updateWrapper;}

mybatis-plus更新问题 全量更新、只更新部分属性相关推荐

  1. Solr的增量更新和全量更新对比

    Solr的增量更新和全量更新 solr的简介 solr是一个采用java语言,基于Lucene的全文搜索引擎. solr的一些原理 solr通过数据库的数据导入到索引库中,并且给数据创建相应的索引,用 ...

  2. 6.7绝地求生服务器维护,绝地求生6月5日更新维护全内容及官方更新时间

    绝地求生6月5日更新维护全内容 绝地求生6月5日更新维护全内容及官方更新时间,关于这次服务器维护要多久呢?什么时候恢复正常呢?下面就跟随小编的脚步一起来看看绝地求生6月5日更新维护全内容及官方更新时间 ...

  3. hive增量表和全量表_hive 拉链表 实现全量数据 增量更新

    背景: 数据表字段有IP,IP省份,IP城市,最新访问时间,假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入,然后每天都有5W左右的IP活跃,然后我要更新这5W个IP的记录到初始化的表 ...

  4. 现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新

    背景: 数据表字段有IP,IP省份,IP城市,最新访问时间,假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入,然后每天都有5W左右的IP活跃,然后我要更新这5W个IP的记录到初始化的表 ...

  5. electron-vue + electron-updater 实现自动更新(全量更新)

    npm 安装 electron-updater@4.0.0 版本 注意 4.0.0版 先打包一次,把打包下的win-unpacked/resources/app-update.yml 的内容复制一份, ...

  6. 华为在偷偷更新鸿蒙,华为手机系统只更新了一点内容,更新包却狂大:华为在偷偷摸摸做什么?...

    原标题:华为手机系统只更新了一点内容,更新包却狂大:华为在偷偷摸摸做什么? 作者:IT老菜鸟 我一直怀疑华为在偷偷摸摸的更换安卓底层虚拟机的东西,但是我就是抓不到证据.相信很多时候很多网友也有这样的感 ...

  7. electron重启后更新_Electron~增量更新和全量更新

    增量更新说明文档 增量更新指的是本地发布前通过打包生成dist,压缩成app.zip包,上传到服务器:客户端每次重启执行一次检测更新,比较本地与远程json的版本,如果有最新版本,则获取zip包并解压 ...

  8. 更新linux centos7服务器的安全更新补丁(只更新补丁而又不更新其他组件) yum security update只更新安全补丁

    当大家想只给centos系统更新"安全补丁"的时候,往往会把其他一些无用的组件给更新下来,现在就给大家说下怎么只更新补丁而又不更新其他组件. 一.只更新补丁而又不更新其他组件:se ...

  9. MySQL定时备份(全量备份+增量备份)

    MySQL 定时备份 参考 zone7_ 的 实战-MySQL定时备份系列文章 参考 zmcyu 的 mysql数据库的完整备份.差异备份.增量备份 更多binlog的学习参考马丁传奇的 MySQL的 ...

  10. mysql 定期备份_MySQL定时备份(全量备份+增量备份)

    MySQL 定时备份 更多binlog的学习参考马丁传奇的 MySQL的binlog日志,这篇文章写得认真详细,如果看的认真的话,肯定能学的很好的. 如果查看binlog是出现语句加密的情况,参考 m ...

最新文章

  1. 一文详解 RNN 及股票预测实战(Python)!
  2. 复旦大学2016--2017学年第二学期(16级)高等代数II期末考试第七大题解答
  3. 数据仓库专题(2)-Kimball维度建模四步骤
  4. dlopen failed: library “libopencv_java4.so“ not found 解决
  5. cv2.dnn读取模型报错
  6. 机器学习实战:支持向量机
  7. .so 依赖目录 cmake_CMake 的研究与学习笔记
  8. python语言程序设计基础嵩天答案第二章_python语言程序设计基础(嵩天版),第二章程序练习题...
  9. 1元解锁 | Python万能代码模板 |10大必学实用技巧
  10. 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
  11. windows登录linux免密码,Windows使用SSH Secure Shell实现免密码登录Linux的方法以及使用scp2命令免密码下载文件...
  12. linux上用selenium登录新浪微博,获取用户关注的用户id
  13. h5离线缓存与浏览器缓存的区别
  14. 四年级下册英语计算机房和教师办公室的图片,人教版四年级英语下册Unit 1单元知识梳理卷...
  15. Redux 入门 -- 处理 async action
  16. 数据库左连接、右连接、内连接、全连接笔记
  17. python多线程求合数个数_求十亿内所有质数的和,怎么做最快?
  18. html5 css 字体加粗,HTML和CSS实现字体加粗的三种方法
  19. mysql 错误代码1130_mysql出现错误码1130怎么办
  20. Mysql 快速生成日期时间维度表

热门文章

  1. Python中的输入输出(IO)
  2. axios token失效刷新token怎么重新请求_Token 刷新并发处理解决方案
  3. mysql让数据-1_mysql数据库基本操作1
  4. tableau示例超市数据在哪儿_Tableau | 超市销售数据可视化分析
  5. Transformer-XL、Vanilla Transformer
  6. VIO,visual-inertial odometry)即视觉惯性里程计
  7. C++例4.11 求两个或三个正整数中的最大数,用带有默认参数的函数实现。
  8. 5G面临的挑战和应用场景
  9. python实现mapreduce求平均值
  10. lua学习 第二章数据与标准库