主表-明细表-(1对多)修改操作业务代码流程

需求描述:

  对一个主表记录的明细表记录进行批量更新操作!

      比如要修改某个学生A的多个兴趣爱好信息~

  学生A 原来兴趣爱好有3个, 现在把 "唱歌" 改成 "rap",  "篮球" 不喜欢了, 并增加一个爱好 "追星"~ 

 保存操作的时候会对明细表同时操作insert/update/delete操作;

代码流水线:

下面总结了一套明细表操作的流水线操作, 代码也可以copy ;

(主表更新操作比较简单,这里忽略 )

/**
     * update details
     * <p>
     * it may contains three operating types 'add' ,'edit', 'delete'
     * </p>
     *
     * @param operVo
     */
    private void doEditDetails(RealInCapitalHeaderOperVo operVo) {
        Long headerId = operVo.getId();
        List<RealInCapitalDetailVo> newDetails = operVo.getDetails();  //前端传过来的修改后的明细
        List<RealInCapitalDetail> oldDetails = findDetails(operVo.getId());  //查询明细数据库记录
       //准备三个集合用于后面承载数据, 这里的Vo, 根据业务调整
        List<RealInCapitalDetailVo> inserts = new ArrayList<>();
        List<RealInCapitalDetailVo> updates = new ArrayList<>();
        List<RealInCapitalDetail> deletes = new ArrayList<>();

//明细记录数据list转map Map
<Long, RealInCapitalDetail> oldMap = Maps.newHashMap(); Set<Long> newIdsSet = Sets.newHashSet(); //list convert map if (CollectionUtils.isNotEmpty(oldDetails)) { oldMap = oldDetails.stream().collect(Collectors.toMap(RealInCapitalDetail::getId, e -> e)); } //find the inserts and updates 找出新增和更新数据 if (CollectionUtils.isNotEmpty(newDetails)) { newDetails.forEach(e -> { if (e.getId() == null) { inserts.add(e); } else { newIdsSet.add(e.getId()); updates.add(e); } }); } //find the deletes 找出删除的数据 if (!oldMap.isEmpty()) { oldMap.forEach((key, value) -> { if (!newIdsSet.contains(key)) { deletes.add(value); } }); } //do insert 执行新增 addDetails(headerId, inserts); //do update 执行更新 updateDetails(updates); //do delete 执行删除 deleteDetails(deletes); }

 

 上面某些代码可根据JDK版本自行调整~  

  具体的DB操作自行对应~

 

总结:  我们不生产代码~ 只做代码的搬运工!

 

posted @ 2020-07-15 09:56  将军上座  阅读(494)  评论(0编辑  收藏  举报