mybatis-plus更新问题 全量更新、只更新部分属性

项目:前端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;
    }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MyBatis-Plus是一个优秀的ORM(对象关系映射)框架,除了提供常见的增删改查操作外,还具备更多强大的功能,如全量更新全量更新是指更新数据库表中的所有字段数据,而不仅仅是更新部分字段。在使用MyBatis-Plus进行全量更新时,我们可以通过以下步骤进行操作: 1. 首先,我们需要定义一个实体类,该实体类对应数据库表的结构,并且具备相应的字段属性和对应的getter和setter方法。 2. 在执行全量更新操作前,我们需要获取待更新的数据,并将其封装到该实体类的实例中。 3. 接下来,我们可以使用MyBatis-Plus提供的全量更新方法进行数据库更新操作。在使用全量更新方法时,我们需要传入待更新的实体对象和更新条件,更新条件可以是数据库表的主键或是其他唯一标识。 4. 当全量更新方法执行完成后,MyBatis-Plus会自动构建并执行相应的SQL更新语句,将实体对象中的所有字段数据同步到数据库表中。 需要注意的是,在使用全量更新方法时,我们需要确保实体对象中的所有非空字段数据都被正确赋值,否则可能会导致数据库表中对应的字段值被错误地更新为NULL。 总结来说,MyBatis-Plus全量更新功能能够方便地将实体对象中的所有字段数据同步到数据库表中,使得更新操作更加便捷。使用全量更新可以避免漏更新字段问题,并且是高效的数据库操作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值