Java实现MySQL表结构导出

Java中连接MySQL数据库并将所有表的结构输出到Excel文件中,每个表的结构放在单独的Sheet页中,并以表名命名Sheet页。基于Apache POI 轻松生成一个包含所有表结构的Excel文件,非常适合数据库文档生成和审查。

引入依赖

xml 复制代码
<dependencies>
    <!-- MySQL JDBC驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.32</version>
    </dependency>
    <!-- Apache POI 用于操作Excel文件 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
    <!-- Apache POI 用于操作Word文件 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.1.2</version>
    </dependency>
    <!-- XMLBeans依赖 -->
    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
        <version>5.1.1</version>
    </dependency>
</dependencies>

连接MySQL并获取表结构,写入文件

java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Arrays;
import java.util.List;

public class ExportDatabaseStructure {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/database";
        String username = "username";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, username, password)) {
            String[] tables = getTables(conn);
            exportToExcel(conn, tables);
            exportToWord(conn, tables);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String[] getTables(Connection conn) throws Exception {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SHOW TABLES");

        List<String> tables = new java.util.ArrayList<>();
        while (rs.next()) {
            tables.add(rs.getString(1));
        }
        return tables.toArray(new String[0]);
    }

    private static void exportToExcel(Connection conn, String[] tables) throws Exception {
        Workbook workbook = new XSSFWorkbook();
        
        for (String table : tables) {
            Sheet sheet = workbook.createSheet(table);
            exportTableStructure(conn, table, (tableName, rs) -> {
                Row header = sheet.createRow(0);
                String[] headers = {"Column", "Type", "Null", "Key", "Default", "Extra"};
                for (int i = 0; i < headers.length; i++) {
                    Cell cell = header.createCell(i);
                    cell.setCellValue(headers[i]);
                }

                int rowIndex = 1;
                while (rs.next()) {
                    Row row = sheet.createRow(rowIndex++);
                    row.createCell(0).setCellValue(rs.getString("Field"));
                    row.createCell(1).setCellValue(rs.getString("Type"));
                    row.createCell(2).setCellValue(rs.getString("Null"));
                    row.createCell(3).setCellValue(rs.getString("Key"));
                    row.createCell(4).setCellValue(rs.getString("Default"));
                    row.createCell(5).setCellValue(rs.getString("Extra"));
                }
            });
        }

        try (FileOutputStream fileOut = new FileOutputStream("DatabaseStructure.xlsx")) {
            workbook.write(fileOut);
        }
        workbook.close();
    }

    private static void exportToWord(Connection conn, String[] tables) throws Exception {
        XWPFDocument document = new XWPFDocument();

        for (String table : tables) {
            document.createParagraph().createRun().setText("Table: " + table);
            XWPFTable wordTable = document.createTable();

            // Create header row
            XWPFTableRow headerRow = wordTable.getRow(0);
            List<String> headers = Arrays.asList("Column", "Type", "Null", "Key", "Default", "Extra");
            for (int i = 0; i < headers.size(); i++) {
                if (i == 0) {
                    headerRow.getCell(0).setText(headers.get(i));
                } else {
                    headerRow.addNewTableCell().setText(headers.get(i));
                }
            }

            exportTableStructure(conn, table, (tableName, rs) -> {
                while (rs.next()) {
                    XWPFTableRow row = wordTable.createRow();
                    row.getCell(0).setText(rs.getString("Field"));
                    row.getCell(1).setText(rs.getString("Type"));
                    row.getCell(2).setText(rs.getString("Null"));
                    row.getCell(3).setText(rs.getString("Key"));
                    row.getCell(4).setText(rs.getString("Default"));
                    row.getCell(5).setText(rs.getString("Extra"));
                }
            });
        }

        try (FileOutputStream out = new FileOutputStream("DatabaseStructure.docx")) {
            document.write(out);
        }
        document.close();
    }

    private static void exportTableStructure(Connection conn, String table, TableStructureConsumer consumer) throws Exception {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SHOW COLUMNS FROM " + table);
        consumer.accept(table, rs);
    }

    @FunctionalInterface
    private interface TableStructureConsumer {
        void accept(String tableName, ResultSet rs) throws Exception;
    }
}
相关推荐
BD_Marathon4 分钟前
【JavaWeb】Tomcat_简介
java·tomcat
⑩-4 分钟前
Java-元注解 (Meta-Annotations)
java
Meteors.5 分钟前
安卓进阶——原理机制
android·java·开发语言
是阿漂啊6 分钟前
vscode运行springboot项目
java·spring boot·后端
ghfdgbg8 分钟前
13. 配置优先级 + Bean的管理 + SpringBoot核心原理
java·spring boot·后端
Moe4888 分钟前
Elasticsearch 8.1 Java API Client 客户端使用指南(索引、文档操作篇)
java·后端·面试
洋亦10 分钟前
GoF23种设计模式 简介
java
Javatutouhouduan10 分钟前
Java面试常问Redis核心知识点整理!
java·数据库·redis·java面试·后端开发·java架构师·java程序员
AAA简单玩转程序设计11 分钟前
谁说Java枚举只是“常量装盒”?它藏着这些骚操作
java·前端
枯基Evan12 分钟前
applicationTaskExecutor Spring 内置线程池失效
java·数据库·spring