目錄
一、實現思路
二、核心代碼
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文件:
?