如何使用Spring将大数据集提取到字符串列表中?

时间:2017-06-14 14:40:01

标签: java mysql spring jdbc

我想从MySql数据库中获取大型数据集,并通过Web服务将其作为逗号分隔List的{​​{1}}返回(不是通过可下载文件,而是直接作为文本)。 因此,我首先需要String格式的所有选定行。

问题:使用Spring实现这一目标的最佳方式是什么?

以下适用于CSV,但我不知道这是否是最佳方法(可能使用Java 8流进行优化)?

如果在某种程度上错误地必须迭代JdbcTemplate并调用ResultSet,则会连接rs.getString(i)的每个元素。是不是有更优雅的方式?

ResultSet

旁注:我必须使用本机SQL进行选择。在上面的例子中,它们要复杂得多。

2 个答案:

答案 0 :(得分:1)

我建议使用Spring Data JPA来获取一组人员。一旦有了一组人员,您就可以使用流将人员映射到您想要收集的字段,并用逗号加入该字段。

假设一个Set,给定一个人有一个名为name的属性,此方法将返回一个逗号分隔的名称列表。

    public String joinName(Set<Person> persons) {
       return persons.stream().map(Person::getName).collect(Collectors.joining(", "));
    }

答案 1 :(得分:1)

您的解决方案看起来很好。我只有两个可能的改进:

  1. ResultSet中已存在对ColumnMapRowMapper的基于索引的访问权限。您可以委托给它并获得(伪代码)

    class CommaSeparatedStringRowMapper implements RowMapper<String> {
        ColumnMapRowMapper delegate = new ColumnMapRowMapper();
    
    @Override
    public Map<String, Object> mapRow(ResultSet rs, int rowNum){
        delegate.mapRow(rs, rowNum).valueSet().toStream.collect(Collectors)
    }
    

    注意:由于创建和访问中间地图,效率会降低,但效果会更好。

    注意2:底层地图应保留列的顺序,但最好仔细检查。

  2. 或者,您可以考虑使用RowCallbackHandler将结果直接写入Webservice响应中。如果操作正确,当您仍在处理查询结果的其余部分时,您的部分响应可能正在前往客户端。因此,这可能会改善延迟和内存消耗。