在
上
一篇
文章中
,我展示了如何将
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可以通过多线程和批量提交来优化此过程,以提高处理速度和效率。