栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis-Plus:update 操作只更新客户端请求参数提供的列名

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis-Plus:update 操作只更新客户端请求参数提供的列名

应用场景

项目使用 mybatis-plus,客户端提交更新请求,有时只需要更新部分列,其中有的列要更新成 null,但 mybatis-plus 默认的更新行为会忽略 null 的字段,当然这个可以通过配置更新策略 updateStrategy 来调整,此文不讨论。

解决方案

最终我设计的方案:客户端提供了哪几列,就只更新这几列,包括 null 值也要更新。

思路:

1、获取 request 请求原始 json 信息,遍历 key 通过 UpdateWrapper 的 set 方法构建 set 子句。
2、但 json 中的 key 名称是对应实体类的属性名称而非数据库字段名,所以需要将属性名转换为数据库字段名。
3、通过 LambdaUtils.getColumnMap(实体类.class) 可以获取到属性-字段名的映射关系。
4、另外 requestBody 流只能读取一次,就需要封装可重复读的 RequestWrapper(可参考开源项目 RuoYi)

最终核心代码:ProjectServiceImpl.java

@Transactional(rollbackFor = Exception.class)
@Override
public void edit(ProjectParam projectParam) {
    //只修改提交的列
    var request = HttpServletUtil.getRequest();
    if (request instanceof RepeatedlyRequestWrapper) {
        //获取原始请求 JSON 参数
        var repeatedlyRequest = (RepeatedlyRequestWrapper) request;
        JSONObject json = JSONObject.parseObject(HttpHelper.getBodyString(repeatedlyRequest));

        //条件构造器
        UpdateWrapper updateWrapper = new UpdateWrapper<>();
        updateWrapper.lambda().eq(Project::getId, projectParam.getId());
        Map columnMap = LambdaUtils.getColumnMap(Project.class);

        //遍历提交的参数,构造 set 片段
        json.keySet().forEach(x -> {
            var k = x.toUpperCase(Locale.ENGLISH); //columnMap 中的 Key 全大写
            if (columnMap.containsKey(k)) {
                var columnName = columnMap.get(k).getColumn();
                updateWrapper.set(columnName, json.get(x));
            }
        });

        //更新
        this.update(updateWrapper);
    }
}
参考资料

https://weiku.co/article/643/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/325221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号