如何关联两个不同数据库的查询结果并组装插入VO对象
跨库关联组装StudentVO实现方案
首先直接回答你的疑问:不要用ArrayList的contains方法做匹配。contains方法每次都会遍历整个列表,时间复杂度是O(n),数据量稍大时性能很差。更合理的方案是用HashMap存储StudentAccess表的关联键值对,匹配时直接通过key取值,整体时间复杂度为O(m+n),性能远高于列表遍历匹配。
另外先纠正你现有代码框架的错误:你共用同一个Statement执行两个查询,执行第二个查询时第一个结果集会被自动关闭,必须为两个数据库的查询分别创建独立的Connection、Statement对象,才能拿到完整的两个结果集。
具体实现步骤
- 先修正数据库2的查询SQL:你原来写的SQL查询了两个相同的
STUD_LOG_ID字段,应该是笔误,需要把第二个字段替换为实际需要的STUD_LOG_IN_ID - 优先执行数据库2的StudentAccess查询,遍历结果集把数据存入HashMap:key为关联字段
STUD_LOG_ID,value为需要取的STUD_LOG_IN_ID - 再执行数据库1的Student查询,遍历每条记录时,用当前记录的
STUD_LOG_ID直接从HashMap中取出对应的STUD_LOG_IN_ID,组装成StudentVO存入结果列表 - 如果业务要求仅保留两库匹配成功的记录,直接跳过匹配不到
STUD_LOG_IN_ID的条目即可;如果需要保留Student表全量数据,给匹配失败的条目给STUD_LOG_IN_ID赋null值即可
代码示例
修正后的数据库2查询SQL
SELECT STUD_LOG_ID, STUD_LOG_IN_ID FROM StudentAccess WHERE logFlag = true
Java实现代码
try ( // 推荐用try-with-resources自动关闭资源,不需要手动写close Connection conn1 = getDataSource1().getConnection(); Statement stmt1 = conn1.createStatement(); ResultSet rs = stmt1.executeQuery(StudentQuery); Connection conn2 = getDataSource2().getConnection(); Statement stmt2 = conn2.createStatement(); ResultSet rs2 = stmt2.executeQuery(StudentAccessQuery); ) { List<StudentVO> listOfStudents = new ArrayList<>(); Map<String, String> accessMap = new HashMap<>(); // 先加载StudentAccess表的关联数据到哈希表 while (rs2.next()) { String logId = rs2.getString("STUD_LOG_ID"); if (logId != null) { accessMap.put(logId, rs2.getString("STUD_LOG_IN_ID")); } } // 遍历Student表组装VO while (rs.next()) { String logId = rs.getString("STUD_LOG_ID"); String logInId = accessMap.get(logId); // 不需要过滤未匹配记录的话,删掉下面这个if判断即可 if (logInId == null) { continue; } StudentVO validStudent = StudentsMapper.mapToVo( rs.getString("STUD_ID_NR"), rs.getString("STUD_NM"), logInId ); if (validStudent != null) { listOfStudents.add(validStudent); } } StudentStore.setAllStudents(listOfStudents); } catch (SQLException e) { // 自行处理业务异常 e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者roger
相关产品推荐
相关产品推荐

