巧用“外挂“思想进行优雅地增加代码逻辑以及融合Mybatis传统SQL方式与Lambda方式

文章讲述了在业务调整后,如何通过Mybatis的Lambda表达式处理动态权限检查,并避免大规模多表关联查询,以提高性能和维护性。作者提出在外挂思想下,只在VO获取后添加新字段,保持原有查询结构不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景还原:

由于业务调整,现有有一个新的需求改动,在之前返回的VO的基础上增加大概10个返回字段,在这里不讨论这次业务调整的合理性,仅讨论在已经调整的情况下,如何完成需求。这里在改之前的业务大概是需要用到A,B,C,D,E五张表,核心表是A,然后通过A.b_id与A.e_id与B,E表产生关联,再通过B,E表中的某些字段与C,D表进行关联。现在需要新返回的字段是D,F,G产生关联之后才能产生的。此外这个查询还需要对A上的check_a,check_b,check_c,check_status字段进行返回,通过当前用户的check权限匹配对应的字段是否为空同时上一级是否已经check,所以这里需要动态的生成SQL。

需求实现

刚刚接触业务时想到使用Mybatis的<if>标签,但是在权限判断部分如果使用在xml中写动态SQL进行逻辑的判断,是比较复杂的,同时还要考虑到后期对应判断条件进行修改的情况,再结合每次返回的数据在A中都只会查到一次,故采用了第二种方式:对应A的单表部分使用Mybatis-Plus的Lambda表达式进行查询,再根据返回的b_id与e_id当做参数进行第二次的多表关联查询。大致逻辑如下:

@Override
public IPage<InspectionAuditInfoVO> page(PageBeanSearch<SearchCriteria> pageBeanSearch) {
   
   
    // 获取当前用户的审批角色配置
    Map<String, AuditConfiguration> auditNodes = auditConfigurationService.getAuditNodes();
    if (auditNodes == null || auditNodes.isEmpty()) {
   
   
        return new Page<>();
    }
    // 构建查询条件:当前审批节点为用户的待审批列表,且前置审批已完成
    LambdaQueryWrapper<BusinessEntity> queryWrapper = loadQueryWrapper(auditNodes);
    // 根据搜索条件追加过滤逻辑
    queryWrapper.eq(Objects.nonNull(pageBeanSearch.getQuery().getCriteriaField()), BusinessEntity::getEntityField, pageBeanSearch.getQuery().getCriteriaValue());
    queryWrapper.ge(Objects.nonNull(pageBeanSearch.getQuery()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值