Java:以CSV格式流式传输JDBC结果集
在上一篇文章中 ,我展示了如何将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的ResultSetExtractor
, JdbcTemplate
可以使用该类从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结果集相关推荐
- Java:逐步读取/流式传输CSV文件
我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中. 当文件的内容适合内存时,此方法有效,但对于较大的文件来说是个问题 ...
- mysql 结果集 超大_使用MySQL流式传输大型结果集
我正在开发一个使用大型MySQL表的spring应用程序.加载大表时,我得到一个OutOfMemoryException,因为驱动程序试图将整个表加载到应用程序内存中. 我尝试使用 statement ...
- jdbc如何写csv文件_Java:将JDBC结果集作为CSV流化
jdbc如何写csv文件 在上一篇文章中 ,我展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方. 这篇文章是关于以CSV格式流式传输. 流式传输使您可以一点一点地传输数据 ...
- java http流式传输
Java中的HTTP流式传输是指在Java应用程序中使用流的方式来发送和接收HTTP请求和响应.这种方式通常用于在Java应用程序中处理大量数据或实时数据流. Java中有许多不同的库和框架可用于实现 ...
- Java:将JDBC ResultSet作为JSON流式传输
这篇文章展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方. 如果要将大型数据集从JDBC数据源以JSON格式发送到Web应用程序,此功能很有用. 流式传输使您可以一点一点 ...
- 读取csv文件 java_Java:逐步读取/流式传输CSV文件
读取csv文件 java 我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中. 当文件的内容适合内存时,此方法有效,但 ...
- java流式传输对象_Java性能:面向教学与流式传输
java流式传输对象 在for循环中向上或向下计数是最有效的迭代方式吗? 有时答案既不可行. 阅读这篇文章,了解不同迭代品种的影响. 迭代性能 关于如何以高性能进行迭代有很多观点. Java中的传统迭 ...
- java流式传输对象_使用Java 8在地图上流式传输
java流式传输对象 在本文中,我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流,并将Stream接口扩展为MapStream! 即使在复杂的情况下,此添加将 ...
- grpc 流式传输_编写下载服务器。 第一部分:始终流式传输,永远不要完全保留在内存中...
grpc 流式传输 下载各种文件(文本或二进制文件)是每个企业应用程序的生死攸关的事情. PDF文档,附件,媒体,可执行文件,CSV,超大文件等.几乎每个应用程序迟早都必须提供某种形式的下载. 下载是 ...
最新文章
- pytorch 常用问题解决
- 国二vb计算机过的办法,国二计算机VB教程10.ppt
- Python 装饰器原理和基本实现
- linux系统时间修改及同步
- 【STM32】光敏传感器示例
- __stdcall和__cdecl的区别
- python调用c 接口_python调用C接口
- String、StringBuffer、StringBuilder类
- 小程序种的轮播图高度的算法
- python编译型语言和解释型语言的区别_编译型语言和解释型语言的区别?
- 洛谷 P1315 观光公交
- js ios和安卓的兼容时间处理
- 第03课:如何快速构建自己的ChatGPT应用?
- 大菠萝 Pinia 持久化方案 Pinia Persist Own
- 2017 java 面试大全
- 【BLE】蓝牙设备地址
- 【来灌灌水】~~感谢csdn平台给予新手学习的地方
- python位置参数错误_python-2.7 – python:组合位置和可选参数时argparse抛出值错误...
- H323协议和sip协议
- Linux常用命令——grub命令