这篇文章展示了如何将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

Java:将JDBC ResultSet作为JSON流式传输相关推荐

  1. Java 异步响应servlet_java – 使用jersey流式传输大型响应,异步

    我想允许客户端(包括非常慢的客户端)从JAX-RS(泽西岛)Web服务下载大文件,我被卡住了.似乎JAX-RS中的异步胖子不支持这一点. >如果必须等待资源在服务器端可用,AsyncRespon ...

  2. Java:以CSV格式流式传输JDBC结果集

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

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

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

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

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

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

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

  6. ajax流式传输,直接流式传输JSON以响应Jackson

    小编典典 您要解决的问题是 return writer.writeValueAsString(getData); 造成太大的String并导致了OutOfMemoryError.Jackson支持St ...

  7. java http流式传输

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

  8. 基于ASP.NET Core SignalR的流式传输

    基于ASP.NET Core SignalR的流式传输 SignalR概述 SignalR是ASP.NET Core下非常流行的实现Web实时功能的库.微软再文档中列出了适合的应用场景: 适合 Sig ...

  9. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

最新文章

  1. Linu 修改maven的setting保护文件
  2. 优质的空间服务商对网站优化的重要性
  3. python局部变量屏蔽全局变量_python – 将局部变量设置为函数而不是使用全局变量来优化函数...
  4. php 文字图片怎么保存为图片,php技术实现加载字体并保存成图片
  5. pytorch 不同设备下保存和加载模型,需要指定设备
  6. zookeeper(一):功能和原理
  7. SAP C4C的扩展字段添加到UI之后,还需要额外的步骤,才能将其添加到OData里
  8. Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结
  9. (转)Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean
  10. secret sharing;拉格朗日插值,shamir秘密分享,peterson秘密分享
  11. ImovieBox视频下载工具
  12. Shadow DOM的理解
  13. iOS webview自适应实际内容高度的4种方法
  14. vb调用摄像头实现拍照源码_牛逼!终于搞了一个高大上的人脸识别登录玩玩(附源码),出乎意料的简单......
  15. python丨Scrapy框架案例二:阳光问政平台
  16. 为什么要隐藏ip地址
  17. 比较两组数据的差异用什么图更直观_用Excel制作旋风图
  18. Google Dremel数据模型详解
  19. 【51单片机学习】PWM电机调速
  20. Java中删除cookie

热门文章

  1. Dubbo(九)之注解配置
  2. Maven的pom.xml文件详解------The Basics
  3. HighChart模拟点击series的name显示隐藏
  4. Spring BeanFactory 容器
  5. 一文告诉你 Java RMI 和 RPC 的区别
  6. java drawimage()方法
  7. Oracle入门(三)之连接与登录
  8. 分布式Session共享解决方案
  9. 为什么Netty这么火?与Mina相比有什么优势?
  10. nginx配置前端反向代理