目录
一、实现思路
二、核心代码
1. 数据库连接部分
2. 数据导出核心逻辑
3. CSV文件写入
三、完整代码实现
五、输出结果
一、实现思路
-
建立数据库连接
-
查询目标表的数据总量和具体数据
-
获取表的列名作为CSV文件的表头
-
将查询结果转换为二维数组格式
-
使用Hutool工具库将数据写入CSV文件
二、核心代码
1. 数据库连接部分
// 声明一个连接对象Connection conn;public void connDB() {try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jk202508", "root", "152602");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
-
使用
Class.forName()
加载MySQL JDBC驱动 -
通过
DriverManager.getConnection()
建立数据库连接 -
需要替换数据库URL、用户名和密码为实际值
2. 数据导出核心逻辑
// 查询数据总量
String sql1 = "select count(*) from " + tableName;// 查询所有数据
String sql2 = "select * from " + tableName;// 获取表结构信息
ResultSetMetaData rsmd = rs2.getMetaData();
int column = rsmd.getColumnCount();// 提取列名作为CSV表头
String[] heads = new String[column];
for(int i = 0; i < column; i++) {heads[i] = rsmd.getColumnName(i + 1);
}
3. CSV文件写入
// 创建CSV写入器,指定GBK编码以支持中文
CsvWriter cwriter = CsvUtil.getWriter("d:/emp.csv", CharsetUtil.CHARSET_GBK);// 写入表头
cwriter.writeHeaderLine(heads);// 逐行写入数据
for (int k = 0; k < datas.length; k++) {cwriter.write(datas[k]);
}
- 使用Hutool工具库进行CSV文件的写入操作
- 使用GBK编码以保证中文内容正常显示
三、完整代码实现
package com.demo1;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.text.csv.CsvWriter;
import cn.hutool.core.util.CharsetUtil;public class ProduceCSV {// 声明一个连接对象Connection conn;public void connDB() {try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jk202508", "root", "152602");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void exportCsv(String tableName) {// 查询数据总量String sql1 = "select count(*) from " + tableName;// 查询所有数据String sql2 = "select * from " + tableName;String[][] datas = null;try {PreparedStatement pstmt1 = conn.prepareStatement(sql1);ResultSet rs1 = pstmt1.executeQuery();int row = 0;while (rs1.next()) {row = rs1.getInt(1);}PreparedStatement pstmt2 = conn.prepareStatement(sql2);ResultSet rs2 = pstmt2.executeQuery();// Java8 Stream 对数据的一个流式处理// 从功耗的角度,我们对数据库动作了2次。ResultSetMetaData rsmd = rs2.getMetaData();int column = rsmd.getColumnCount();// 提取列名作为CSV表头String[] heads = new String[column];for( int i =0;i<column;i++){heads[i] = rsmd.getColumnName(i+1);System.out.println(heads[i]);}datas = new String[row][column];int count = 0;while (rs2.next()) {for (int i = 0; i < column; i++) {datas[count][i] = rs2.getString(i + 1);}count++;}// 创建CSV写入器,指定GBK编码以支持中文CsvWriter cwriter = CsvUtil.getWriter("d:/emp.csv", CharsetUtil.CHARSET_GBK);// 二维数组,数组中的数组,{{},{},{}};// 写入表头cwriter.writeHeaderLine(heads);for (int k = 0; k < datas.length; k++) {cwriter.write(datas[k]);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if(null!=conn){try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public static void main(String[] args) {ProduceCSV p = new ProduceCSV();p.connDB();p.exportCsv("t_emp");}}
五、输出结果
执行程序后,将在D盘根目录生成emp.csv文件,文件内容包含:
-
第一行为表头(数据库表的列名)
-
后续每一行对应数据库中的一条记录
-
文件使用GBK编码,支持中文显示
数据库中的t_emp表:
D盘根目录:
生成的CSV文件: