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的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

button onclick 多个同名_多个按钮的OnClickListener()android

您只需按照以下步骤轻松实现……您不必为每个按钮编写新的onClickListener …只需将View.OnClickLister实现到您的Activity / Fragment ..它将实现名为onClick()的新方法,用于处理Button,TextView等的onClick事件.Implement OnClickListener() in your Activity/Fragmentpublic…

Github入门学习

目的 借助github托管项目代码 基本概念 仓库&#xff08;Repository&#xff09;&#xff1a;仓库用来存放项目代码&#xff0c;每个项目对应一个仓库&#xff0c;多个开源项目则有多个仓库。 收藏&#xff08;Star&#xff09;&#xff1a;收藏项目&#xff0c;方便下次查看…

【渝粤教育】电大中专电子商务网站建设与维护 (25)作业 题库

1.目前&#xff0c;阿里巴巴集团旗下主要交易市场不包括哪个&#xff08; &#xff09; A.中国批发交易平台 B.全球批发交易平台 C.中国交易市场 D.国际交易市场 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.阿里巴巴是于1999年创立的&#xff08; &#…

【渝粤教育】电大中专职业应用写作作业 题库

1.每个大学生最应该具备的写作能力是&#xff08;&#xff09; A.诗歌创作 B.小说创作 C.应用文写作 D.散文创作 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.下面说法正确的是&#xff08;&#xff09; A.应用文可以发挥依据和凭证的作用 B.应用文不能规范人们…

在vscode上编写jsp_使用vscode高效编写博客园博客

图片上传可真麻烦!之前写博客的时候&#xff0c;我一般是使用马克飞象先编辑好然后直接复制粘贴到博客园中&#xff0c;这样做一方面可以一边写一遍预览改&#xff0c;另一方面可以保存到印象笔记中&#xff0c;这样一举两得&#xff0c;比较方便。可唯一的问题就在于&#xff…

dev分支和master是什么_天天用Git,分支开发你怎么弄的?

来源| juejin.im/post/6844903635533594632Git 是目前最流行的源代码管理工具。为规范开发&#xff0c;保持代码提交记录以及 git 分支结构清晰&#xff0c;方便后续维护&#xff0c;现规范git的相关操作。分支命名1、master 分支master 为主分支&#xff0c;也是用于部署生产环…

gradle ant_区分基于Ant目标的Gradle任务

gradle ant在我的博客文章《 从Ant Build演变Gradle构建&#xff1a;导入Ant构建文件》中 &#xff0c;我演示了如何使用Gradle内置的基于AntBuilder的Ant支持在Gradle构建中导入Ant目标。 然后&#xff0c;可以将这些Ant目标作为Gradle任务进行访问&#xff0c;并与Gradle构建…

labview求n阶乘的和_求极限方法总结

函数的极限第一步&#xff1a;判断极限类型1、 型常用方法&#xff1a;①洛必达法则 ②等价无穷小代换 ③泰勒公式2、 型常用方法&#xff1a;①洛必达法则②分子分母同除以分子和分母各项中最高阶的无穷大③基本极限&#xff1a; 当nm时&#xff0c;极限等于 ,当n&#xff1c;…

使用Gradle构建Monorepo项目

根据Wikipedia的说法 &#xff0c; monorepo是一种软件开发策略&#xff0c;其中许多项目存储在同一存储库中。 这种策略可以快速检测到因依赖关系的更改而导致的潜在问题和破坏&#xff0c;并且已被许多使用大型代码库的组织采用&#xff0c;例如Google&#xff0c;Facebook和…

【渝粤教育】广东开放大学 国际私法 形成性考核 (41)

选择题 题目&#xff1a;下列哪些情况适用我国有关法律&#xff1f;&#xff08; &#xff09; 题目&#xff1a;我国法律规定司法协助的内容包括&#xff08; &#xff09;。 题目&#xff1a;采取民事登记婚姻方式是结婚的实质要件。&#xff08; &#xff09; 题目&#xff…

【渝粤教育】广东开放大学 工商企业文化 形成性考核 (55)

选择题 题目&#xff1a;企业制度能否对企业管理起作用&#xff0c;关键在于“自律”和“他律”的相结合&#xff0c;即企业管理制度和&#xff08; &#xff09;的相融合&#xff0c;这才有可能达到企业的均衡发展。 题目&#xff1a;任何的企业管理制度&#xff0c;再好的企业…

uniapp怎么引入css_CSS 三种基础选择器

本节我们来学习 CSS 中的选择器&#xff0c;选择器是 CSS 里面一个很重要的概念&#xff0c;HTML 中的所有标签样式&#xff0c;都是通过不同的 CSS 选择器进行控制的。我们只需要通过选择器&#xff0c;就可以对不同的 HTML 标签进行选择&#xff0c;并指定各种样式声明。在 C…

万网绑定二级域名_Hexo+yilia主题网站绑定个性域名

上篇我们已经成功部署了自己的博客网站&#xff0c;初始化的网站看上去似乎少了些内容(高端大气上档次的设置)。接下来我们就进一步完善我们的博客网站(孟繁胜游)。绑定个性域名当你打开github给你设定的固定域名时&#xff0c;是不是感觉low极了。主要是github给你的域名在你注…

guava缓存数据到本地_扩展Guava缓存以溢出到磁盘

guava缓存数据到本地缓存使您可以轻松地显着加速应用程序。 Java平台的两种出色的缓存实现是Guava缓存和Ehcache 。 尽管Ehcache功能丰富得多&#xff08;例如其Searchable API &#xff0c;将缓存持久化到磁盘或溢出到大内存的可能性&#xff09;&#xff0c;但与Guava相比&am…

【渝粤教育】广东开放大学 性考 形成性考核 (33)

选择题 题目&#xff1a;GATT缓和了国际贸易()有效地促进了国际贸易的发展。 题目&#xff1a;WTO的公平竞争原则要求在WTO框架下,成员方应()采取扭曲市场竞争的措施 题目&#xff1a;技术法规般涉及国家安全、()、环境保护、劳动保护、节能等方面技术法规还涉及到与产品特性、…

jmeterhttp代理服务器_Jmeter使用HTTP代理服务器录制

1、添加线程组2、线程组下&#xff0c;添加录制控制器3、添加HTTP代理服务器&#xff0c;右键单击测试计划添加→非测试元件→HTTP代理服务器。1)HTTP代理服务器配置&#xff0c;目标控制器选择测试计划>线程组>录制控制器&#xff1b;端口号随便输入一个&#xff0c;与浏…

【渝粤教育】广东开放大学 文化田野调查 形成性考核 (22)

选择题 题目&#xff1a; 文化遗产主要是指的非物质文化遗产。 答案&#xff1a;看左侧 题目&#xff1a; 县级以上人民政府根据非物质文化遗产保护、保存工作需要&#xff0c;组织非物质文化遗产调查。非物质文化遗产调查由县级以上研究部门负责进行。 答案&#xff1a;看左侧…

GraalVM上的Picocli:极快的命令行应用程序

GraalVM GraalVM允许您提前将程序编译为本地可执行文件。 与Java VM相比&#xff0c;生成的程序具有更快的启动时间和更低的运行时内存开销。 这对于通常是短暂的命令行实用程序尤其有用。 GraalVM对Java反射的支持有限&#xff0c;它需要提前了解反射访问的程序元素。 反射访…

【渝粤教育】广东开放大学 标准化理论与方法 形成性考核 (50)

选择题 题目&#xff1a; 我国的标准层级分为&#xff08;&#xff09;级。 答案&#xff1a;看左侧 题目&#xff1a; 国家标准中"要求”属于必备要素&#xff0c;也是规范性技术要素。 答案&#xff1a;看左侧 题目&#xff1a; &#xff0c;标准可分为国际标准、区域标…

【渝粤教育】广东开放大学 社会保障学 形成性考核 (34)

选择题 题目&#xff1a;乡政府现要对申请低保的村民张三进行资格调查&#xff0c;按照法律规定&#xff0c;不属于调查范围的是&#xff08; &#xff09; 题目&#xff1a;我国现行《失业保险条例》所指失业人员为 &#xff08; &#xff09; 题目&#xff1a;《失业保险条例…