在上一篇文章中 ,我展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方。 这篇文章是关于以CSV格式流式传输的。 流式传输使您可以一点一点地传输数据,而不必将所有数据都加载到服务器的内存中。

例如,考虑以下ResultSet

+---------+-----+
| Name    | Age |
+---------+-----+
| Alice   |  20 |
| Bob     |  35 |
| Charles |  50 |
+---------+-----+

相应的CSV是:

name,age
Alice,20
Bob,35
Charles,50

以下类(在我的GitHub Repository中也可用)可用于将ResultSet转换为CSV。 请注意,此类实现Spring的ResultSetExtractorJdbcTemplate可以使用该类从ResultSet提取结果。

/*** Streams a ResultSet as CSV.*/
public class StreamingCsvResultSetExtractorimplements ResultSetExtractor<Void> {private static char DELIMITER = ',';private final OutputStream os;/*** @param os the OutputStream to stream the CSV to*/public StreamingCsvResultSetExtractor(final OutputStream os) {this.os = os;}@Overridepublic Void extractData(final ResultSet rs) {try (var pw = new PrintWriter(os, true)) {final var rsmd = rs.getMetaData();final var columnCount = rsmd.getColumnCount();writeHeader(rsmd, columnCount, pw);while (rs.next()) {for (var i = 1; i <= columnCount; i++) {final var value = rs.getObject(i);pw.write(value == null ? "" : value.toString());if (i != columnCount) {pw.append(DELIMITER);}}pw.println();}pw.flush();} catch (final SQLException e) {throw new RuntimeException(e);}return null;}private static void writeHeader(final ResultSetMetaData rsmd,final int columnCount, final PrintWriter pw) throws SQLException {for (var i = 1; i <= columnCount; i++) {pw.write(rsmd.getColumnName(i));if (i != columnCount) {pw.append(DELIMITER);}}pw.println();}
}

要将其用于带有JAX-RS的Web服务中:

import javax.ws.rs.core.StreamingOutput;@GET
@Path("runQuery")
@Produces("text/csv")
public StreamingOutput runQuery() {return new StreamingOutput() {@Overridepublic void write(final OutputStream os)throws IOException, WebApplicationException {jdbcTemplate.query("select name, age from person",new StreamingCsvResultSetExtractor(os));}};
}

相关文章:

流式传输JDBC ResultSet作为JSON

翻译自: https://www.javacodegeeks.com/2018/12/java-streaming-jdbc-resultset-csv.html

Java:以CSV格式流式传输JDBC结果集相关推荐

  1. Java:逐步读取/流式传输CSV文件

    我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中. 当文件的内容适合内存时,此方法有效,但对于较大的文件来说是个问题 ...

  2. mysql 结果集 超大_使用MySQL流式传输大型结果集

    我正在开发一个使用大型MySQL表的spring应用程序.加载大表时,我得到一个OutOfMemoryException,因为驱动程序试图将整个表加载到应用程序内存中. 我尝试使用 statement ...

  3. jdbc如何写csv文件_Java:将JDBC结果集作为CSV流化

    jdbc如何写csv文件 在上一篇文章中 ,我展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方. 这篇文章是关于以CSV格式流式传输. 流式传输使您可以一点一点地传输数据 ...

  4. java http流式传输

    Java中的HTTP流式传输是指在Java应用程序中使用流的方式来发送和接收HTTP请求和响应.这种方式通常用于在Java应用程序中处理大量数据或实时数据流. Java中有许多不同的库和框架可用于实现 ...

  5. Java:将JDBC ResultSet作为JSON流式传输

    这篇文章展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方. 如果要将大型数据集从JDBC数据源以JSON格式发送到Web应用程序,此功能很有用. 流式传输使您可以一点一点 ...

  6. 读取csv文件 java_Java:逐步读取/流式传输CSV文件

    读取csv文件 java 我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中. 当文件的内容适合内存时,此方法有效,但 ...

  7. java流式传输对象_Java性能:面向教学与流式传输

    java流式传输对象 在for循环中向上或向下计数是最有效的迭代方式吗? 有时答案既不可行. 阅读这篇文章,了解不同迭代品种的影响. 迭代性能 关于如何以高性能进行迭代有很多观点. Java中的传统迭 ...

  8. java流式传输对象_使用Java 8在地图上流式传输

    java流式传输对象 在本文中,我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流,并将Stream接口扩展为MapStream! 即使在复杂的情况下,此添加将 ...

  9. grpc 流式传输_编写下载服务器。 第一部分:始终流式传输,永远不要完全保留在内存中...

    grpc 流式传输 下载各种文件(文本或二进制文件)是每个企业应用程序的生死攸关的事情. PDF文档,附件,媒体,可执行文件,CSV,超大文件等.几乎每个应用程序迟早都必须提供某种形式的下载. 下载是 ...

最新文章

  1. pytorch 常用问题解决
  2. 国二vb计算机过的办法,国二计算机VB教程10.ppt
  3. Python 装饰器原理和基本实现
  4. linux系统时间修改及同步
  5. 【STM32】光敏传感器示例
  6. __stdcall和__cdecl的区别
  7. python调用c 接口_python调用C接口
  8. String、StringBuffer、StringBuilder类
  9. 小程序种的轮播图高度的算法
  10. python编译型语言和解释型语言的区别_编译型语言和解释型语言的区别?
  11. 洛谷 P1315 观光公交
  12. js ios和安卓的兼容时间处理
  13. 第03课:如何快速构建自己的ChatGPT应用?
  14. 大菠萝 Pinia 持久化方案 Pinia Persist Own
  15. 2017 java 面试大全
  16. 【BLE】蓝牙设备地址
  17. 【来灌灌水】~~感谢csdn平台给予新手学习的地方
  18. python位置参数错误_python-2.7 – python:组合位置和可选参数时argparse抛出值错误...
  19. H323协议和sip协议
  20. Linux常用命令——grub命令

热门文章

  1. 2、oracle数据库的用户和权限
  2. 22、java中的注解
  3. Hadoop入门(五)IO操作
  4. Java虚拟机必学之四大知识要点,附学习资料
  5. MySQL 的索引是什么?怎么优化?
  6. (七)HTML和CSS 、JavaScript 和Java到底有什么区别,今天终于明白了!!!
  7. hexo部署在码云出现样式问题
  8. Spring依赖注入和控制反转
  9. 存放80000000学生成绩的集合,怎么统计平均分性能高
  10. 2018蓝桥杯省赛---java---C---1(哪天返回)