在Java中,将数据库查询结果导出为CSV格式是一个常见的任务,特别是在需要将数据共享或导入到其他系统中时。Apache POI库提供了一个强大的工具集,用于处理Excel文件,而CSV是Excel的一种简单文本格式。以下是一个基于Java和Apache POI库的简单示例,展示如何从数据库中查询指定字段并导出为CSV文件。
环境准备
首先,确保你的项目中包含了以下依赖项:
- Java开发环境
- Apache POI库:
poi-ooxml和poi依赖
在你的pom.xml文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
</dependencies>
连接数据库
在开始之前,你需要确保你的数据库连接正常。以下是一个简单的示例,演示如何使用JDBC连接到MySQL数据库:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnector {
public static Connection connect() throws SQLException {
String url = "jdbc:mysql://localhost:3306/yourdatabase";
String user = "username";
String password = "password";
return DriverManager.getConnection(url, user, password);
}
}
查询数据库
接下来,编写一个方法来执行SQL查询并获取结果:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DatabaseQuery {
public static List<Map<String, Object>> queryDatabase(String query) throws SQLException {
List<Map<String, Object>> results = new ArrayList<>();
try (Connection connection = DatabaseConnector.connect();
PreparedStatement statement = connection.prepareStatement(query);
ResultSet resultSet = statement.executeQuery()) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
while (resultSet.next()) {
Map<String, Object> row = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
Object value = resultSet.getObject(i);
row.put(columnName, value);
}
results.add(row);
}
}
return results;
}
}
导出为CSV
现在,我们可以使用Apache POI创建一个CSV文件,并将查询结果写入其中:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class CSVExporter {
public static void exportToCSV(List<Map<String, Object>> data, String filePath) throws IOException {
Workbook workbook = new SXSSFWorkbook(100); // Maintain 100 rows in memory, exceeding rows will be flushed to disk
Sheet sheet = workbook.createSheet("Data");
// Write header
Row header = sheet.createRow(0);
List<String> columnNames = data.get(0).keySet();
for (int i = 0; i < columnNames.size(); i++) {
Cell cell = header.createCell(i);
cell.setCellValue(columnNames.get(i));
}
// Write data
for (int i = 0; i < data.size(); i++) {
Row row = sheet.createRow(i + 1);
Map<String, Object> rowData = data.get(i);
int cellIndex = 0;
for (String columnName : columnNames) {
Cell cell = row.createCell(cellIndex++);
Object value = rowData.get(columnName);
if (value instanceof String) {
cell.setCellValue((String) value);
} else if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Double) {
cell.setCellValue((Double) value);
} else if (value instanceof Boolean) {
cell.setCellValue((Boolean) value);
} else {
cell.setCellValue(value.toString());
}
}
}
try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
workbook.write(outputStream);
}
workbook.dispose();
}
}
使用示例
最后,将所有这些组件组合在一起,创建一个完整的应用程序:
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) {
try {
String query = "SELECT id, name, email FROM users";
List<Map<String, Object>> data = DatabaseQuery.queryDatabase(query);
CSVExporter.exportToCSV(data, "users.csv");
System.out.println("CSV file has been created successfully.");
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
}
通过运行Main类,你将能够从数据库中查询数据,并将其导出为名为users.csv的CSV文件。
这个示例提供了一个基本的框架,你可以根据需要扩展它,例如添加错误处理、优化性能或支持不同的数据库类型。记住,CSV导出只是数据交互的一种方式,根据你的需求,你可能还需要考虑其他格式,如Excel或JSON。
