想在获取hailer_info数据时,根据里面的model_id和light_id字段分别获取到 light_control表里的lc_theme 和 hailer_model_info表里的model_name字段。有两种方式。分别是在SQL中进行多表查询 和 在Java代码中循环查询。那么那种方法好呢?
在SQL中进行多表查询
在Java代码中循环查询
而且这样写页不大好,查询语句最好写在循环体外面
-
减少循环中的数据库查询:
-
在循环之前,将所有需要的
light_id
和model_id
提取出来,一次性查询所有相关的lightTheme
和modelName
,然后通过Map进行缓存,避免在循环中多次查询数据库。
-
-
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中直接进行多表查询
优点
-
性能优势:
-
减少数据库交互次数:通过在SQL中直接进行多表查询,一次查询即可获取所有需要的数据,减少了与数据库的交互次数。
-
数据库优化:数据库的查询优化器可以对多表查询进行优化,提高查询效率。
-
-
减少代码复杂性:
-
逻辑集中:所有数据获取逻辑集中在SQL语句中,减少了Java代码中的循环和多次查询逻辑。
-
易于维护:SQL语句的逻辑清晰,便于理解和维护。
-
缺点
-
SQL复杂度:
-
可读性降低:当涉及多个表的连接和复杂的条件时,SQL语句可能会变得难以阅读和理解。
-
维护难度:如果表结构或业务逻辑发生变化,可能需要调整SQL语句。
-
-
灵活性受限:
-
动态性不足:如果查询条件非常复杂且动态变化,SQL语句可能需要频繁修改。
-
2. 在Java代码中通过循环和多次查询实现
优点
-
灵活性高:
-
动态性强:可以根据不同的业务逻辑动态调整查询逻辑,例如在循环中根据条件动态调用不同的Mapper方法。
-
易于扩展:在Java代码中更容易实现复杂的逻辑处理,例如对查询结果进行额外的校验或转换。
-
-
可读性高:
-
逻辑清晰:Java代码的逻辑通常比复杂的SQL语句更容易理解,尤其是对于不熟悉SQL的开发者。
-
调试方便:在Java代码中更容易进行调试和日志记录。
-
缺点
-
性能问题:
-
多次数据库交互:每次循环都会调用数据库查询,导致数据库交互次数显著增加,性能下降。
-
资源消耗:频繁的数据库连接和查询会增加数据库的负载,可能影响系统的整体性能。
-
-
代码复杂性:
-
冗余代码:需要编写额外的循环和查询逻辑,代码量增加。
-
维护成本:逻辑分散在多个地方,增加了维护难度。
-
具体比较
特性 | 在SQL中多表查询 | 在Java代码中循环查询 |
---|---|---|
性能 | 高(一次查询) | 低(多次查询) |
代码复杂性 | SQL复杂,但逻辑集中 | Java代码复杂,逻辑分散 |
灵活性 | 低(SQL修改成本高) | 高(动态性强) |
可读性 | SQL语句可能难以理解 | Java代码易于理解 |
维护难度 | SQL维护成本高 | Java代码维护成本高 |
推荐方案
-
优先推荐在SQL中进行多表查询:
-
如果查询逻辑相对固定,且对性能要求较高,建议使用在SQL中进行多表查询的方式。这种方式可以显著减少数据库交互次数,提高查询效率。
-
示例场景:常见的列表查询、分页查询等,这些场景的查询条件相对固定,适合通过SQL语句集中处理。
-
-
在Java代码中循环查询作为补充:
-
如果查询逻辑非常复杂且动态变化频繁,或者需要在查询结果上进行额外的复杂处理,可以考虑在Java代码中通过循环和多次查询实现。
-
示例场景:动态根据用户输入生成查询条件,或者对查询结果进行复杂的校验和转换
-
总结
-
优先推荐在SQL中进行多表查询,适用于查询逻辑相对固定且对性能要求较高的场景。
-
在Java代码中循环查询作为补充,适用于查询逻辑非常复杂且动态变化频繁的场景。
-
如果选择在Java代码中实现,可以通过提取ID列表并一次性查询的方式优化性能。