You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联两个不同数据库的查询结果并组装插入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:15:53