关联更新封装(三)

简介: 关联更新封装(三)

太如意的生活便是平凡的生活,太容易获得的东西,便不是贵重的东西。——茅盾

今天是另外一种类型的关联更新封装

public static <T, K extends Comparable<? super K> & Serializable, S> BaseDbBO<S> saveSub(SubBO<T, K, S> bo) {
    val subIds = Steam.of(bo.getMainList())
            .flat(data -> Steam.of(bo.getSubIdGetters()).map(f -> f.apply(data)))
            .nonNull().toList();
    val subClazz = (Class<S>) Steam.of(bo.getSubGetters())
            .findFirst()
            .map(LambdaHelper::resolve)
            .map(LambdaExecutable::getReturnType)
            .orElseThrow(() -> new IllegalStateException("sub class not found"));
    val primaryKeyGetter = MpUtil.<S, K>getGetter(subClazz,
            TableInfoHelper.getTableInfo(subClazz).getKeyProperty());
    val idSubMapFromDb = subIds.isEmpty() ? new HashMap<K, S>() :
            Steam.of(Database.listByIds(subIds, subClazz)).toMap(primaryKeyGetter);
    val subIdGetterSetterMap = Steam.of(bo.getSubIdGetters())
            .toMap(Function.identity(), MpUtil::getSetter);
    val comparesGetterSetterMap = Steam.of(bo.getSubCompares())
            .toMap(Function.identity(), MpUtil::getSetter);
    Steam.of(bo.getMainList()).forEach(data -> {
        Steam.of(bo.getSubIdGetters()).zip(bo.getSubGetters(),
                (subIdGetter, subGetter) -> {
                    val subFromClient = subGetter.apply(data);
                    val subId = subIdGetter.apply(data);
                    if (Objects.isNull(subFromClient)) {
                        return null;
                    }
                    // insert
                    if (Objects.isNull(subId)) {
                        bo.getWillInsertList().add(subFromClient);
                        return subFromClient;
                    }
                    val subFromDb = idSubMapFromDb.get(subId);
                    if (Objects.isNull(subFromDb)) {
                        bo.getWillInsertList().add(subFromClient);
                        return subFromClient;
                    }
                    // update
                    Steam.of(bo.getSubCompares()).forEach(ac -> {
                        val value = ac.apply(subFromClient);
                        if (!Objects.equals(value, ac.apply(subFromDb))) {
                            val executable = LambdaHelper.resolve((Serializable) ac);
                            val setter = (BiConsumer<S, Object>) comparesGetterSetterMap.get(ac);
                            val fieldType = ReflectHelper.getField(executable.getClazz(),
                                    BeanHelper.getPropertyName(executable.getName())).getType();
                            setter.accept(subFromDb, value);
                            if (isComparable(fieldType) && (!bo.getWillUpdateList().contains(subFromDb))) {
                                bo.getWillUpdateList().add(subFromDb);
                            }
                        }
                    });
                    return subFromClient;
                }).toList();
    });
    bo.setAfterExecuted(b -> {
        val dataList = Steam.of(bo.getMainList()).flat(data ->
                Steam.of(bo.getSubIdGetters()).zip(bo.getSubGetters(),
                        (subIdGetter, subGetter) -> {
                            S subFromClient = subGetter.apply(data);
                            if (Objects.nonNull(subFromClient)) {
                                val primaryKey = primaryKeyGetter.apply(subFromClient);
                                subIdGetterSetterMap.get(subIdGetter).accept(data, primaryKey);
                            }
                            return subFromClient;
                        }).nonNull().toList()).toList();
        bo.setDataList(dataList);
    });
    return bo;
}


对应的bo

package com.ruben.simplestreamquery.pojo.bo;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 * @author VampireAchao
 * @since 2023/3/16 10:18
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class SubBO<T, K extends Comparable<? super K> & Serializable, S> extends BaseDbBO<S> {
    private List<T> mainList;
    private List<SFunction<T, K>> subIdGetters;
    private List<SFunction<T, S>> subGetters;
    private List<SFunction<S, ?>> subCompares;
    public SubBO() {
        super();
        this.mainList = new ArrayList<>();
        this.subIdGetters = new ArrayList<>();
        this.subGetters = new ArrayList<>();
        this.subCompares = new ArrayList<>();
    }
}

目前仍然处于完善中,所以还没有集成进stream-query,临时放到另一个仓库里

地址

相关文章
|
1月前
|
JavaScript
componentDidUpdate 方法在组件更新后做什么?
【10月更文挑战第27天】在 `componentDidUpdate` 中使用 `this.props` 和 `this.state` 时要小心,因为此时它们已经是更新后的最新值,与 `prevProps` 和 `prevState` 所代表的前一个状态不同。同时,如果在 `componentDidUpdate` 中再次调用 `setState`,要确保不会导致无限循环的更新,通常需要添加适当的条件判断来避免不必要的状态更新。
75 2
|
7月前
|
C++
57静态关联与动态关联
57静态关联与动态关联
70 0
关联更新封装(二)
关联更新封装(二)
64 2
|
7月前
activiti并行网关执行时每个关联表的变化
activiti并行网关执行时每个关联表的变化
144 0
|
SQL 数据库 索引
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
|
Java uml
依赖和关联的对比和区别
依赖和关联的对比和区别
196 0
|
数据库 数据安全/隐私保护 索引
Gorm学习(五)进阶:多态关联、关联标签以及事务
出现需要外键引用多个表的情况,不可能删除原来表结构,重新添加一个外键ID再建表,所以我们可以建立一个交叉表。让Addres不再依赖于User表或者Order表。
843 1
Gorm学习(五)进阶:多态关联、关联标签以及事务
|
存储 JSON 前端开发
Android数据库存储模块封装,让操作记录更好用可复用
Android数据库存储模块封装,让操作记录更好用可复用
|
存储 编译器 程序员
C++数据定义及相关操作
C++数据定义及相关操作
144 0
C++数据定义及相关操作