更新時間:2022-11-28 11:38:59 來源:動力節(jié)點(diǎn) 瀏覽6199次
將數(shù)據(jù)從數(shù)據(jù)庫導(dǎo)出到CSV文件任何軟件應(yīng)用程序的是一項(xiàng)常見的任務(wù)。在這篇文章中,將指導(dǎo)你如何編寫Java代碼從數(shù)據(jù)庫讀取數(shù)據(jù)并寫入一個CSV文件。
這項(xiàng)技術(shù)是簡單的。我們使用JDBC來從數(shù)據(jù)庫讀取數(shù)據(jù)并使用文件I / O寫CSV文件。和底層數(shù)據(jù)庫的JDBC驅(qū)動程序庫是必要的(在這篇文章中使用MySQL)。
假設(shè)我們有一個表結(jié)構(gòu)如下:
這個表包含一些數(shù)據(jù)是這樣的:
首先,您將學(xué)習(xí)如何編寫Java代碼來從這個表的數(shù)據(jù)導(dǎo)出到一個CSV文件。然后我將與你分享如何編寫,可重用的代碼,適用于任何表。
下面的代碼是一個簡單的Java程序,它連接到一個MySQL數(shù)據(jù)庫讀取從審查表的所有行,寫數(shù)據(jù)到一個CSV文件:
package net.codejava;
import java.io.*;
import java.sql.*;
/**
* A simple Java program that exports data from database to CSV file.
* @author Nam Ha Minh
* (C) Copyright codejava.net
*/
public class SimpleDb2CsvExporter {
public static void main(String[] args) {
String jdbcURL = "jdbc:mysql://localhost:3306/sales";
String username = "root";
String password = "password";
String csvFilePath = "Reviews-export.csv";
try (Connection connection = DriverManager.getConnection(jdbcURL, username, password)) {
String sql = "SELECT * FROM review";
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery(sql);
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(csvFilePath));
// write header line containing column names
fileWriter.write("course_name,student_name,timestamp,rating,comment");
while (result.next()) {
String courseName = result.getString("course_name");
String studentName = result.getString("student_name");
float rating = result.getFloat("rating");
Timestamp timestamp = result.getTimestamp("timestamp");
String comment = result.getString("comment");
if (comment == null) {
comment = ""; // write empty value for null
} else {
comment = "\"" + comment + "\""; // escape double quotes
}
String line = String.format("\"%s\",%s,%.1f,%s,%s",
courseName, studentName, rating, timestamp, comment);
fileWriter.newLine();
fileWriter.write(line);
}
statement.close();
fileWriter.close();
} catch (SQLException e) {
System.out.println("Datababse error:");
e.printStackTrace();
} catch (IOException e) {
System.out.println("File IO error:");
e.printStackTrace();
}
}
}
正如你所看到的在這個程序中,它是寫為一個特定的表的列的名稱是已知的。運(yùn)行這個程序,你會看到Reviews-export。生成csv文件包含以下內(nèi)容:
注意ID字段的值是不出口。一些列的值放在雙引號是仍然有效,如果文本包含逗號。
讓我們看一下如何編寫一個更通用的程序,可以使用任何表。以下是完整的程序代碼:
package net.codejava;
import java.io.*;
import java.sql.*;
import java.text.*;
import java.util.*;
/**
* An advanced Java program that exports data from any table to CSV file.
* @author Nam Ha Minh
* (C) Copyright codejava.net
*/
public class AdvancedDb2CsvExporter {
private BufferedWriter fileWriter;
public void export(String table) {
String jdbcURL = "jdbc:mysql://localhost:3306/sales";
String username = "root";
String password = "password";
String csvFileName = getFileName(table.concat("_Export"));
try (Connection connection = DriverManager.getConnection(jdbcURL, username, password)) {
String sql = "SELECT * FROM ".concat(table);
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery(sql);
fileWriter = new BufferedWriter(new FileWriter(csvFileName));
int columnCount = writeHeaderLine(result);
while (result.next()) {
String line = "";
for (int i = 2; i <= columnCount; i++) {
Object valueObject = result.getObject(i);
String valueString = "";
if (valueObject != null) valueString = valueObject.toString();
if (valueObject instanceof String) {
valueString = "\"" + escapeDoubleQuotes(valueString) + "\"";
}
line = line.concat(valueString);
if (i != columnCount) {
line = line.concat(",");
}
}
fileWriter.newLine();
fileWriter.write(line);
}
statement.close();
fileWriter.close();
} catch (SQLException e) {
System.out.println("Datababse error:");
e.printStackTrace();
} catch (IOException e) {
System.out.println("File IO error:");
e.printStackTrace();
}
}
private String getFileName(String baseName) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String dateTimeInfo = dateFormat.format(new Date());
return baseName.concat(String.format("_%s.csv", dateTimeInfo));
}
private int writeHeaderLine(ResultSet result) throws SQLException, IOException {
// write header line containing column names
ResultSetMetaData metaData = result.getMetaData();
int numberOfColumns = metaData.getColumnCount();
String headerLine = "";
// exclude the first column which is the ID field
for (int i = 2; i <= numberOfColumns; i++) {
String columnName = metaData.getColumnName(i);
headerLine = headerLine.concat(columnName).concat(",");
}
fileWriter.write(headerLine.substring(0, headerLine.length() - 1));
return numberOfColumns;
}
private String escapeDoubleQuotes(String value) {
return value.replaceAll("\"", "\"\"");
}
public static void main(String[] args) {
AdvancedDb2CsvExporter exporter = new AdvancedDb2CsvExporter();
exporter.export("review");
exporter.export("product");
}
}
你通過表名出口()方法,它所有的工作。CSV文件的名字是生成基于表名,其次是_Export和當(dāng)前日期時間:
String csvFileName = getFileName(table.concat("_Export"));
getFileName()方法編寫如下:
private String getFileName(String baseName) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String dateTimeInfo = dateFormat.format(new Date());
return baseName.concat(String.format("_%s.csv", dateTimeInfo));
}
如果評審表名,那么CSV文件的名稱將review_export_2019 - 10 - 14 - _20 52 - 55. CSV。時間戳添加到CSV文件名稱將用于最終用戶將能夠區(qū)分每個數(shù)據(jù)導(dǎo)出。
writeHeaderLine()方法編寫列名在CSV文件的第一行。它使用ResultSetMetaData列的名稱——這意味著它可以處理任何表。
注意,程序不出口ID列的值(它應(yīng)該是總是第一列)。
然后您可以使用該程序從任何您希望的表導(dǎo)出數(shù)據(jù),如下:
AdvancedDb2CsvExporter exporter = new AdvancedDb2CsvExporter();
exporter.export("review");
exporter.export("product");
以上就是關(guān)于“Java數(shù)據(jù)庫導(dǎo)出csv文件的代碼”介紹,大家如果想了解更多相關(guān)知識,不妨來關(guān)注一下本站的Java視頻教程,里面的課程內(nèi)容從入門到精通,細(xì)致全面,通俗易懂,很適合沒有基礎(chǔ)的小伙伴學(xué)習(xí),希望對大家能夠有所幫助。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743