在SQL中进行多表查询 和 在Java代码中循环查询

想在获取hailer_info数据时,根据里面的model_id和light_id字段分别获取到 light_control表里的lc_theme 和 hailer_model_info表里的model_name字段。有两种方式。分别是在SQL中进行多表查询 和 在Java代码中循环查询。那么那种方法好呢?

在SQL中进行多表查询

在Java代码中循环查询

而且这样写页不大好,查询语句最好写在循环体外面

  1. 减少循环中的数据库查询

    • 在循环之前,将所有需要的light_idmodel_id提取出来,一次性查询所有相关的lightThememodelName,然后通过Map进行缓存,避免在循环中多次查询数据库。

     

  2.    public List<HailerInfo> selectHailerInfoList(HailerInfo hailerInfo) {
            List<HailerInfo> hailers = hailerInfoMapper.selectHailerInfoList(hailerInfo);
    
            // 提取所有需要的light_id和model_id
            List<Long> lightIds = hailers.stream()
                    .map(HailerInfo::getLightId)
                    .filter(Objects::nonNull)
                    .distinct()
                    .collect(Collectors.toList());
            List<Integer> modelIds = hailers.stream()
                    .map(HailerInfo::getModelId)
                    .filter(Objects::nonNull)
                    .distinct()
                    .collect(Collectors.toList());
    
            // 一次性查询所有lightTheme和modelName
            Map<Integer, String> lightThemeMap = lightControlMapper.selectLightThemesByLcIds(lightIds)
                    .stream()
                    .collect(Collectors.toMap(LightControl::getLcId, LightControl::getLcTheme));
            Map<Integer, String> modelNameMap = hailerModelInfoMapper.selectModelNamesByModelIds(modelIds)
                    .stream()
                    .collect(Collectors.toMap(HailerModelInfo::getModelId, HailerModelInfo::getModelName));
    
            // 设置到hailer对象中
            hailers.forEach(hailer -> {
                hailer.setLightTheme(lightThemeMap.get(hailer.getLightId()));
                hailer.setModelName(modelNameMap.get(hailer.getModelId()));
            });
    
            return hailers;
        }
    

    使用批量查询

    如果数据库支持批量查询,可以通过批量查询接口一次性获取所有需要的数据,减少数据库交互次数。

 

区别

这两种实现方式各有优缺点,适用于不同的场景。以下是对两种方式的详细分析,帮助你选择更适合的方案。

1. 在SQL中直接进行多表查询

优点

  1. 性能优势

    • 减少数据库交互次数:通过在SQL中直接进行多表查询,一次查询即可获取所有需要的数据,减少了与数据库的交互次数。

    • 数据库优化:数据库的查询优化器可以对多表查询进行优化,提高查询效率。

  2. 减少代码复杂性

    • 逻辑集中:所有数据获取逻辑集中在SQL语句中,减少了Java代码中的循环和多次查询逻辑。

    • 易于维护:SQL语句的逻辑清晰,便于理解和维护。

缺点

  1. SQL复杂度

    • 可读性降低:当涉及多个表的连接和复杂的条件时,SQL语句可能会变得难以阅读和理解。

    • 维护难度:如果表结构或业务逻辑发生变化,可能需要调整SQL语句。

  2. 灵活性受限

    • 动态性不足:如果查询条件非常复杂且动态变化,SQL语句可能需要频繁修改。

2. 在Java代码中通过循环和多次查询实现

优点

  1. 灵活性高

    • 动态性强:可以根据不同的业务逻辑动态调整查询逻辑,例如在循环中根据条件动态调用不同的Mapper方法。

    • 易于扩展:在Java代码中更容易实现复杂的逻辑处理,例如对查询结果进行额外的校验或转换。

  2. 可读性高

    • 逻辑清晰:Java代码的逻辑通常比复杂的SQL语句更容易理解,尤其是对于不熟悉SQL的开发者。

    • 调试方便:在Java代码中更容易进行调试和日志记录。

缺点

  1. 性能问题

    • 多次数据库交互:每次循环都会调用数据库查询,导致数据库交互次数显著增加,性能下降。

    • 资源消耗:频繁的数据库连接和查询会增加数据库的负载,可能影响系统的整体性能。

  2. 代码复杂性

    • 冗余代码:需要编写额外的循环和查询逻辑,代码量增加。

    • 维护成本:逻辑分散在多个地方,增加了维护难度。

具体比较

特性在SQL中多表查询在Java代码中循环查询
性能高(一次查询)低(多次查询)
代码复杂性SQL复杂,但逻辑集中Java代码复杂,逻辑分散
灵活性低(SQL修改成本高)高(动态性强)
可读性SQL语句可能难以理解Java代码易于理解
维护难度SQL维护成本高Java代码维护成本高

推荐方案

  1. 优先推荐在SQL中进行多表查询

    • 如果查询逻辑相对固定,且对性能要求较高,建议使用在SQL中进行多表查询的方式。这种方式可以显著减少数据库交互次数,提高查询效率。

    • 示例场景:常见的列表查询、分页查询等,这些场景的查询条件相对固定,适合通过SQL语句集中处理。

  2. 在Java代码中循环查询作为补充

    • 如果查询逻辑非常复杂且动态变化频繁,或者需要在查询结果上进行额外的复杂处理,可以考虑在Java代码中通过循环和多次查询实现。

    • 示例场景:动态根据用户输入生成查询条件,或者对查询结果进行复杂的校验和转换

总结

  • 优先推荐在SQL中进行多表查询,适用于查询逻辑相对固定且对性能要求较高的场景。

  • 在Java代码中循环查询作为补充,适用于查询逻辑非常复杂且动态变化频繁的场景。

  • 如果选择在Java代码中实现,可以通过提取ID列表并一次性查询的方式优化性能。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值