我想从MySql数据库中获取大型数据集,并通过Web服务将其作为逗号分隔List
的{{1}}返回(不是通过可下载文件,而是直接作为文本)。
因此,我首先需要String
格式的所有选定行。
问题:使用Spring实现这一目标的最佳方式是什么?
以下适用于CSV
,但我不知道这是否是最佳方法(可能使用Java 8流进行优化)?
如果在某种程度上错误地必须迭代JdbcTemplate
并调用ResultSet
,则会连接rs.getString(i)
的每个元素。是不是有更优雅的方式?
ResultSet
旁注:我必须使用本机SQL进行选择。在上面的例子中,它们要复杂得多。
答案 0 :(得分:1)
我建议使用Spring Data JPA来获取一组人员。一旦有了一组人员,您就可以使用流将人员映射到您想要收集的字段,并用逗号加入该字段。
假设一个Set,给定一个人有一个名为name的属性,此方法将返回一个逗号分隔的名称列表。
public String joinName(Set<Person> persons) {
return persons.stream().map(Person::getName).collect(Collectors.joining(", "));
}
答案 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:底层地图应保留列的顺序,但最好仔细检查。
或者,您可以考虑使用RowCallbackHandler
将结果直接写入Webservice响应中。如果操作正确,当您仍在处理查询结果的其余部分时,您的部分响应可能正在前往客户端。因此,这可能会改善延迟和内存消耗。