一篇 文章中 ,我展示了如何将 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 StreamingCsvResultSetExtractor implements 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; @Override public 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;
@Path("runQuery")
@Produces("text/csv")
public StreamingOutput runQuery() {
  return new StreamingOutput() {
    @Override
    public 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

jdbc如何写csv文件

jdbc如何写csv文件 在上一篇文章中 ,我展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方。 这篇文章是关于以CSV格式流式传输。 流式传输使您可以一点一点地传输数据,而不必将所有数据都加载到服务器的内存中。 例如,考虑以下ResultSet : +---------+-----+| Name | Age |+---------+-----+...
在上一篇文章中 ,我展示了如何将java.sql.ResultSet转换为JSON并将其流回调用方。 这篇文章是关于以CSV格式流式传输的。 流式传输使您可以一点一点地传输数据,而不必将所有数据都加载到服务器的内存中。 例如,考虑以下ResultSet : +---------+-----+ | Name | Age | +---------+-----+ | Alice |...
//1.加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); System.out.println("加载驱动============="); //2.获得数据库链接
Java 是一种广泛应用于开发各种类型软件的语言,在数据处理和管理方面也有着很好的支持和应用。当涉及到将 CSV(逗号分隔值)文件导入到数据库中时,Java可以提供一种高效且稳定的方法。 CSV文件通常包含一组以逗号或其他特殊分隔符分隔的数据项,这些数据项需要被导入到数据库的表中。Java可以通过使用包含了读取和CSV文件的类库来解决这个问题。 一般来说,读取CSV文件的步骤如下: 1. 使用Java提供的输入流读取CSV文件中的每一行数据。 2. 将每一行数据按照分隔符分割成多个数据项。 3. 使用Java数据库连接(JDBC)来连接到目标数据库。 4. 将CSV文件中的数据转换为SQL语句,并使用JDBC发送到数据库中。 5. 根据需要对导入数据进行一些额外的验证或调整。 6. 最后关闭JDBC连接。 总体而言,在Java中将CSV文件导入数据库是一项相对简单的任务,可以通过Java IO、JDBC和一些开源的CSV库来实现。它可以提高数据的整体管理和准确度,也可以减少手动数据输入的错误率。此外,Java可以通过多线程和批量提交来优化此过程,以提高处理速度和效率。