MybatisPlus自定义实现saveOrUpdate()方法

一、问题

在项目开发中经常会出现对于数据列表的增删改查操作,例如:在编辑一场赛事的时候就会有比赛项目列表,此时就需要实现对于某场赛事对于比赛项目的删除、新增、修改等操作。

二、原因

首先对于以上问题,是因为比赛项目列表的整体提交产生的,导致数据库中的数据与提交数据的不对应。比如:数据库中已存在的比赛项目为1、2、3.而此次编辑后提交的比赛项目为2、3、4。此时就需要删除项目1,然后新增项目4。

三、解决

赛事service层,这里就只放Impl实现了

    @Override
    @Transactional
    public void updateCompetition(Competition competition) {
        // 编辑赛事
        int i = adminCompetitionMapper.updateById(competition);
        if (i < 1) {
            log.error(StrUtil.format("【编辑赛事】编辑赛事失败。"));
            throw new BadRequestException(StrUtil.format("【编辑赛事】编辑赛事失败。"));
        }

        // 维护参赛地点中间表
        List<CompetitionAreaMid> competitionAreaMidList = competition.getAreas();
        List<Long> airMidIds = new ArrayList<>();
        competitionAreaMidList.forEach(competitionAreaMid -> airMidIds.add(competitionAreaMid.getId()));
        // 删除参赛地点
        LambdaUpdateWrapper<CompetitionAreaMid> areaMidLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        areaMidLambdaUpdateWrapper.eq(CompetitionAreaMid::getCompetitionId, competition.getId())
                .notIn(CompetitionAreaMid::getId, airMidIds)
                .set(CompetitionAreaMid::getDeleted, true);
        adminCompetitionAreaMidService.update(areaMidLambdaUpdateWrapper);
        competitionAreaMidList.forEach(competitionAreaMid -> competitionAreaMid.setCompetitionId(competition.getId()));
        // 新增或更新比赛项目
        adminCompetitionAreaMidService.saveOrUpdate(competitionAreaMidList);

        // 维护比赛项目中间表
        List<CompetitionFightApply> competitionFightApplyList = competition.getFights();
        List<Long> fightApplyIds = new ArrayList<>();
        competitionFightApplyList.forEach(competitionFightApply -> fightApplyIds.add(competitionFightApply.getId()));
        // 删除比赛项目
        LambdaUpdateWrapper<CompetitionFightApply> fightApplyLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        fightApplyLambdaUpdateWrapper.eq(CompetitionFightApply::getCompetitionId, competition.getId())
                .notIn(CompetitionFightApply::getId, fightApplyIds)
                .set(CompetitionFightApply::getDeleted, true);
        adminCompetitionFightApplyService.update(fightApplyLambdaUpdateWrapper);
        competitionFightApplyList.forEach(competitionFightApply -> competitionFightApply.setCompetitionId(competition.getId()));
        // 新增或更新比赛项目(如果审核已通过,同时维护对战表)
        adminCompetitionFightApplyService.saveOrUpdate(competitionFightApplyList, competition.getCheckStatus() == 1);
    }

    /**
     * description:赛事详情
     *
     * @param id 赛事id
     * @return AdminCompetitionDetailsDTO
     * @author ZhaoMing
     * @date 2021/3/27 13:08
     */
    @Override
    public AdminCompetitionDetailsDTO selectCompetition(Long id) {
        // 查询赛事
        Competition competition = adminCompetitionMapper.selectById(id);
        AdminCompetitionDetailsDTO adminCompetitionDetailsDTO = AdminCompetitionMapStruct.INSTANCE.entityToDTO(competition);

        // 查询参赛地点
        LambdaQueryWrapper<CompetitionAreaMid> areaMidLambdaQueryWrapper = new LambdaQueryWrapper<>();
        areaMidLambdaQueryWrapper.eq(CompetitionAreaMid::getCompetitionId, competition.getId());
        List<CompetitionAreaMid> competitionAreaMidList = adminCompetitionAreaMidMapper.selectList(areaMidLambdaQueryWrapper);
        List<AdminCompetitionAreaDTO> areas = AdminCompetitionMapStruct.INSTANCE.areaEntityToDTO(competitionAreaMidList);
        adminCompetitionDetailsDTO.setAreas(areas);

        // 查询比赛项目
        List<AdminCompetitionFightApplyDTO> fightApplies = adminCompetitionFightApplyMapper.queryFightApplies(competition.getId());
        adminCompetitionDetailsDTO.setFights(fightApplies);

        return adminCompetitionDetailsDTO;
    }

比赛地点的saveOrUpdate方法

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveOrUpdate(List<CompetitionAreaMid> competitionAreaMidList) {
        competitionAreaMidList.forEach(competitionAreaMid -> {
            if (ObjectUtil.isNull(adminCompetitionAreaMidMapper.selectById(competitionAreaMid))) {
            	// 如果参赛地点不存在,新增
                int i = adminCompetitionAreaMidMapper.insert(competitionAreaMid);
                if (i < 1) {
                    log.error(StrUtil.format("【编辑赛事】编辑参赛地点失败。赛事id:{}", competitionAreaMid.getCompetitionId()));
                    throw new BadRequestException(StrUtil.format("【编辑赛事】编辑参赛地点失败。赛事id:{}", competitionAreaMid.getCompetitionId()));
                }
            } else {
            	// 如果存在,修改
                int i = adminCompetitionAreaMidMapper.updateById(competitionAreaMid);
                if (i < 1) {
                    log.error(StrUtil.format("【编辑赛事】编辑参赛地点失败。赛事id:{}", competitionAreaMid.getCompetitionId()));
                    throw new BadRequestException(StrUtil.format("【编辑赛事】编辑参赛地点失败。赛事id:{}", competitionAreaMid.getCompetitionId()));
                }
            }
        });
    }

比赛项目的saveOrUpdate方法

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveOrUpdate(List<CompetitionFightApply> competitionFightApplyList) {
        competitionFightApplyList.forEach(competitionFightApply -> {
            if (ObjectUtil.isNull(adminCompetitionFightApplyMapper.selectById(competitionFightApply))) {
                // 如果比赛项目不存在,新增比赛项目
                int i = adminCompetitionFightApplyMapper.insert(competitionFightApply);
                if (i < 1) {
                    log.error(StrUtil.format("【编辑赛事】编辑比赛项目失败。赛事id:{}", competitionFightApply.getCompetitionId()));
                    throw new BadRequestException(StrUtil.format("【编辑赛事】编辑比赛项目失败。赛事id:{}", competitionFightApply.getCompetitionId()));
                }
            } else {
                // 如果已存在,更新项目
                int i = adminCompetitionFightApplyMapper.updateById(competitionFightApply);
                if (i < 1) {
                    log.error(StrUtil.format("【编辑赛事】编辑比赛项目失败。赛事id:{}", competitionFightApply.getCompetitionId()));
                    throw new BadRequestException(StrUtil.format("【编辑赛事】编辑比赛项目失败。赛事id:{}", competitionFightApply.getCompetitionId()));
                }
            }
        });
    }

至此就可以实现赛事中对于参赛地点和比赛项目列表的修改了。


版权声明:本文为qq_43620423原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。