首页 > 解决方案 > 优化获取助手id的Java代码

问题描述

要求:我有一个文件,我需要将与其经理对应的助理员工 ID 添加到数据库中。所以在文件中我得到了助手的登录 ID。我需要将登录 ID 传递给 db 以获取助手的相应员工 ID 并添加到我从文件中获取的列表中。

// code for getting employee from file - returns a list

private void setAssistantEmployeeId(List<E> empFile){
    List<E> empFilter = empFile.stream().filter(emp -> emp.getLoginId()!=null).collect(Collectors.toList());
    
    String sql = "SELECT ID FROM EMPLOYEE WHERE LOGIN_ID = ";
    
    List<E> tempList = new ArrayList<>(empFilter);
    
    for(E emp : empFilter){
        tempList.addAll(jdbcTemplate.query(sql+emp.getLoginId(), (resultset,i)->{
            emp.setAssistantEmployeeId(resultset.getString("ID"));
            return emp;
        }));
    }
}

上面的代码按预期工作,但执行需要很长时间。我需要一些帮助来优化这段代码。有人可以帮我优化这段代码吗?

谢谢你。

标签: javalistjava-8jdbctemplate

解决方案


private void setAssistantEmployeeId(List<E> empFile) throws SQLException {
    List<E> empFilter = empFile.stream().filter(emp -> emp.getLoginId()!=null).collect(Collectors.toList());

    //1. query all LOGIN_ID
    String sql = "SELECT ID, LOGIN_ID FROM EMPLOYEE WHERE LOGIN_ID IN (" + empFilter.stream().map(emp -> emp.getLoginId())
            .collect(Collectors.joining("','")) + ")";

    // create map[LOGIN_ID, ID]
    ResultSet rs = runQuery(sql); // execute this query in your way
    Map<String, String> id_loginId = new HashMap<>();
    while (rs.next()) {
        id_loginId.put(rs.getString("LOGIN_ID"), rs.getString("ID"));
    }

    // 3. assign ID value
    empFilter.forEach(e -> {
        e.setAssistantEmployeeId(id_loginId.getOrDefault(e.getLoginId(), ""));
    });
}

推荐阅读