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

这篇文章展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方。 如果要将大型数据集从JDBC数据源以JSON格式发送到Web应用程序,此功能很有用。 流式传输使您可以一点一点地传输数据,而不必将所有数据都加载到服务器的内存中。

例如,考虑以下ResultSet

+---------+-----+
| name    | age |
+---------+-----+
| Alice   |  20 |
| Bob     |  35 |
| Charles |  50 |
+---------+-----+

对应的JSON是:

[{ "name": "Alice",   "age": 20 },{ "name": "Bob",     "age": 35 },{ "name": "Charles", "age": 50 },
]

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

/*** Streams a ResultSet as JSON.*/
public class StreamingJsonResultSetExtractor implements ResultSetExtractor<Void> {private final OutputStream os;/*** @param os the OutputStream to stream the JSON to*/public StreamingJsonResultSetExtractor(final OutputStream os) {this.os = os;}@Overridepublic Void extractData(final ResultSet rs) {final var objectMapper = new ObjectMapper();try (var jg = objectMapper.getFactory().createGenerator(os, JsonEncoding.UTF8)) {writeResultSetToJson(rs, jg);jg.flush();} catch (IOException | SQLException e) {throw new RuntimeException(e);}return null;}private static void writeResultSetToJson(final ResultSet rs,final JsonGenerator jg)throws SQLException, IOException {final var rsmd = rs.getMetaData();final var columnCount = rsmd.getColumnCount();jg.writeStartArray();while (rs.next()) {jg.writeStartObject();for (var i = 1; i <= columnCount; i++) {jg.writeObjectField(rsmd.getColumnName(i), rs.getObject(i));}jg.writeEndObject();}jg.writeEndArray();}
}

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

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

翻译自: https://www.javacodegeeks.com/2018/09/streaming-jdbc-resultset-json.html

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

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

相关文章

android 开发 短信,Android开发之短信发送

今天要讲的是使用Android开发发送短信程序。我们先来看下运行效果图(1) 图(2)图(3)图(1)&#xff1a;当我们运行项目时&#xff0c;出现在屏幕的效果&#xff1b;图(2)&#xff1a;当我们输…

ISP (互联网服务提供商)

ISP&#xff1a;全称为Internet Service Provider&#xff0c;即因特网服务提供商&#xff0c;能提供拨号上网服务、网上浏览、下载文件、收发电子邮件等服务&#xff0c;是网络最终用户进入Internet的入口和桥梁。它包括Internet接入服务和Internet内容提供服务。这里主要是In…

android远程命令行工具,Android 使用 adb命令 远程安装apk

【UWP】解析GB2312、GBK编码网页乱码问题在WebHttpRequest请求网页后,获取到的中文是乱码,类似这样: ˹ŵ&#xfffd;&#xfffd;Ϸ&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd; - &#xff…

多路径路由算法—ECMP、WCMP

传统的网络拓朴结构可以形象的表示为树结构&#xff0c;我们称之为“有中心的网络拓扑结构”&#xff0c;简单地认为很多流量请求最终会汇聚到主干网这样的路由中心&#xff0c;才能转发到下一条路径。 传统的路由协议都是采用单路径路由的方式&#xff0c;简单地认为&#xf…

新的JEP草案将简化Java中的撰写

偏爱继承而不是继承 有充分的理由&#xff0c;“在继承中偏爱组成”这一口头禅在文献中已多次重复。 但是&#xff0c;Java很少或根本没有语言支持来简化对象的组成。 但是&#xff0c;有了名为“简洁方法机构”的新的JEP草案&#xff0c;情况可能会略有改善。 Brian Goetz负责…

应用层组播、IP组播

通常说的组播一般指IP组播&#xff0c;IGMP协议等 什么是应用层组播&#xff1f; 应用层组播通过在应用层复制和缓存数据包而不是在路由器上复制数据包来避免IP组播的部署问题。应用层组播无须对路由器作任何修改,因此在 Internet 上非常容易部署 为了改善网络效率&#xff0…

android 酷炫倒计时,android 好用的倒计时

android倒计时 是在原有TextView的基础上进行二次开发的自定义View效果图这个主要是结合了android的CountDownTimer&#xff0c;这个一般就是发送短信的倒计时。包含功能倒计时时间超过一个小时显示 时&#xff1a;分&#xff1a;秒时间小于一小时显示&#xff1a;分 &#xff…

android 获取对象,在Android中获取LayoutInflater对象的方法

1、通过系统服务来获得&#xff0c;这是最标准的&#xff1a;LayoutInflater inflater (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);2、通过LayoutInflater的静态方法获得&#xff1a;LayoutInflater inflater LayoutInflater.from(context)…

音视频常见问题分析和解决:延迟(时延 delay)和抖动

延迟和抖动 延迟&#xff1a;是网络传输中的一个重要指标&#xff0c;测量了数据从一个端点到另外一个端点所需的时间。一般我们用毫秒作为其单位。通常我们也把延迟叫做延时&#xff0c;但是延时有时还会表示数据包发送端到接受端的往返时间。这个往返时间我们可以通过网络监…

forkjoin_应用ForkJoin –从最佳到快速

forkjoin到目前为止&#xff0c;JDK 7已很好地掌握在开发人员手中&#xff0c;并且大多数人都听说过ForkJoin&#xff0c;但是没有多少人有时间或机会去尝试它。 它引起了并且可能仍然引起一些混乱&#xff0c;与普通线程池有什么不同。 [1] 我在本文中的目标是通过一个代码示…

android usb触摸屏驱动 win10,Win10手机居然这样兼容安卓:直接运行apk!

摘要&#xff1a;“应用太少是硬伤&#xff01;”这是WP粉吐槽微软简洁而有力的一句话。最新的Win10Mobile预览版中首次引入了微软的安卓子系统&#xff0c;这也是微软推行的ProjectAstoria的一部分。那么Win10手机究竟要如何兼容安卓应用呢&#xff1f;微软最新一份招聘启事似…

GSM、UMTS、LTE

GSM 全球移动通信系统(Global System for Mobile Communications) &#xff0c;由欧洲电信标准组织ETSI制订的一个数字移动通信标准。它的空中接口采用时分多址技术。自90年代中期投入商用以来&#xff0c;被全球超过100个国家采用。GSM标准的无处不在使得在移动电话运营商之间…

Java应用程序中的验证

我经常看到的项目几乎没有任何有意识的数据验证策略。 他们的团队在截止日期&#xff0c;明确要求的巨大压力下工作&#xff0c;只是没有足够的时间以适当且一致的方式进行验证。 因此&#xff0c;数据验证代码随处可见&#xff1a;JavaScript片段&#xff0c;Java屏幕控制器&a…

android daemon 程序,(转)Android App Daemon

一直没空把App Daemon的原理整理一下&#xff0c;见不少人在问原理&#xff0c;我这里就把整个流程大概的说一下。关于进程守护&#xff0c;从接触Android没多久就一直想实现&#xff0c;网上给出的方案也是各种各样&#xff0c;有双服务方式&#xff0c;有利用系统定时器方式的…

什么是卫星的有效载荷?

直接执行特定卫星任务的仪器、设备或分系统就是卫星的有效载荷。 有效载荷是指航天器上装载的为直接实现航天器在轨运行要完成的特定任务的仪器、设备、人员、试验生物及试件等。 有效载荷的种类很多&#xff0c;即使是同一种类型的有效载荷&#xff0c;性能差别也很大。 返回型…

升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...

华为鸿蒙2.0系统升级了怎么退回EMUI11系统&#xff1f;很多用户升级了又不知道如何才能退回到原来的系统&#xff0c;下面就让老铁下载小编为大家带来&#xff0c;2.0系统升级退回EMUI11系统操作教程详解。这次开启华为鸿蒙2.0系统手机开发者beta版公测招募的机型有华为P40 、P…

OpenFlow和SDN的历史和原理介绍

OpenFlow相关的历史、新闻&#xff1a;http://blog.csdn.net/jincm13/article/details/7825754 起源与发展 【https://36kr.com/p/5035985】   OpenFlow起源于斯坦福大学的Clean Slate项目组 [1] 。CleanSlate项目的最终目的是要重新发明英特网&#xff0c;旨在改变设计已略…

可见性得以保障,并不意味着_战略模式并不意味着春天!

可见性得以保障,并不意味着是的&#xff0c;所以可以说您正在编写一个Spring MVC应用程序&#xff0c;然后您决定&#xff1a;“我想做一些单独的封装算法&#xff0c;这些算法可以互换来执行特定的行为”。 对此的经典回应是“您需要一个战略模式男孩&#xff01;”。 所以&a…

小米miuiVS华为鸿蒙,华为鸿蒙2.0 vs 小米MIUI 12.5

原标题&#xff1a;华为鸿蒙2.0 vs 小米MIUI 12.5不久前有媒体在视频中展示了鸿蒙2.0和苹果IOS14两个操作系统下App的启动速度&#xff0c;结果是鸿蒙2.0完胜IOS14。此后不久&#xff0c;该媒体发布了华为鸿蒙2.0和小米MIUI 12.5对比视频。同上次一样&#xff0c;这次依然是选择…

传播时延(propagation delay)与发送时延(transmission delay)

原文&#xff1a; http://wzw19191.blog.sohu.com/135110823.html 传播时延(propagation delay)这个概念&#xff0c;是指电磁信号或者光信号在传输介质中传输的时延&#xff0c;而在光纤或者铜线中&#xff0c;光信号和电磁信号的传播速度都在20万公里/秒以上&#xff0c;在传…