首页 > 数据库 >java实现导出mysql数据库表信息

java实现导出mysql数据库表信息

时间:2024-02-06 11:01:01浏览次数:29  
标签:headerRow null java String 数据库 createCell dataRow mysql setCellValue

java实现导出mysql数据库表信息,导出信息包含:数据库用户名,表英文名,表中文名,表业务描述,字段数量等等

package src.main.biz.ucenter.utils;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.*;

public class DBSchemaToExcelExporter2 {

    public static void main(String[] args) throws SQLException, IOException {
        String jdbcUrl = "jdbc:mysql://192.12.6.12:3306/ghe_testbranch_guowang_report?serverTimezone=CTT&useUnicode=true&characterEncoding=UTF-8&useSSL=false&rewriteBatchedStatements=true";
        String username = "root";
        String password = "123456";
        String outputFile = "F:\\file\\report2.xlsx";
        exportTableStructureToExcel(jdbcUrl,username,password,outputFile);
    }

    private static void exportTableStructureToExcel(String jdbcUrl, String username, String password, String outputFile) throws SQLException, IOException {
        // 建立数据库连接
        Statement statement = null;
        ResultSet resultSet = null;
        Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
        try (Workbook workbook = new XSSFWorkbook(); OutputStream outputStream = new FileOutputStream(outputFile)) {
            Sheet sheet = workbook.createSheet("表结构");

            // 创建表头行
            Row headerRow = sheet.createRow(0);
            headerRow.createCell(0).setCellValue("数据库用户名");
            headerRow.createCell(1).setCellValue("表英文名");
            headerRow.createCell(2).setCellValue("表中文名");
            headerRow.createCell(3).setCellValue("表业务描述");
            headerRow.createCell(4).setCellValue("表记录数");
            headerRow.createCell(5).setCellValue("表中字段数量");
            headerRow.createCell(6).setCellValue("表类型");
            headerRow.createCell(7).setCellValue("表类型编码");
            headerRow.createCell(8).setCellValue("负面清单类型");
            headerRow.createCell(9).setCellValue("负面清单类型编码");
            headerRow.createCell(10).setCellValue("是否接入中台");
            headerRow.createCell(11).setCellValue("是否上传");
            headerRow.createCell(12).setCellValue("数据库类型");
            headerRow.createCell(13).setCellValue("创建时间");
            headerRow.createCell(14).setCellValue("最后更新时间");
            headerRow.createCell(15).setCellValue("发布时间");
            headerRow.createCell(16).setCellValue("当天数据最晚更新时间");
            headerRow.createCell(17).setCellValue("数据标签");
            headerRow.createCell(18).setCellValue("业务标签");
            headerRow.createCell(19).setCellValue("表类型");
            headerRow.createCell(20).setCellValue("数据是否从数据中台同步复制");
            headerRow.createCell(21).setCellValue("标识数据更新字段");
            headerRow.createCell(22).setCellValue("数据更新时间范围");
            // 获取数据库元数据
            DatabaseMetaData dbmd = conn.getMetaData();

            // 遍历所有表
            ResultSet tablesRs = dbmd.getTables(null, null, "%", null); // 可根据实际需求修改schema和tablePattern

            int rowNum = 1;
            // 创建Statement对象
            statement = conn.createStatement();
            while (tablesRs.next()) {
                String tableName = tablesRs.getString("TABLE_NAME"); // 表英文名
                //使用下面的tablesRs.getString("REMARKS")获取到的表注释是空的,所以才使用下面 resultSet = statement.executeQuery("SHOW CREATE TABLE " + tableName)获取表注释
                //String tableComment = tablesRs.getString("REMARKS");
                String tableComment = "";

                // 执行SHOW CREATE TABLE查询
                resultSet = statement.executeQuery("SHOW CREATE TABLE " + tableName);
                // 解析结果
                if (resultSet.next()) {
                    String createTableStatement = resultSet.getString("Create Table");
                    int startIndex = createTableStatement.indexOf("COMMENT='") + 9;
                    int endIndex = createTableStatement.indexOf("'", startIndex);
                    if (startIndex != -1 && endIndex != -1) {
                        tableComment = createTableStatement.substring(startIndex, endIndex);
                        System.out.println("表注释: " + tableComment);
                    } else {
                        System.out.println("无法找到表注释");
                    }
                }

                // 获取表字段数量
                ResultSet columnsRs = dbmd.getColumns(null, null, tableName, null);
                int columnCount = 0;
                while (columnsRs.next()) {
                    columnCount++;
                }
                columnsRs.close();


                // 写入一行数据
                Row dataRow = sheet.createRow(rowNum++);
                dataRow.createCell(0).setCellValue(username); // 数据库用户名(如果是固定用户则可直接赋值)
                dataRow.createCell(1).setCellValue(tableName);
                dataRow.createCell(2).setCellValue(tableComment);
                dataRow.createCell(3).setCellValue(tableComment);
                dataRow.createCell(4).setCellValue("");//领导说这个先不填,需要的时候再写代码
                dataRow.createCell(5).setCellValue(columnCount);
                dataRow.createCell(6).setCellValue("有效表");
                dataRow.createCell(7).setCellValue("05001");
                dataRow.createCell(8).setCellValue("非负面清单");
                dataRow.createCell(9).setCellValue("04001");
                dataRow.createCell(10).setCellValue("否");
                dataRow.createCell(11).setCellValue("否");
                dataRow.createCell(12).setCellValue("MySQL");
                dataRow.createCell(13).setCellValue("2023/6/9");
                dataRow.createCell(14).setCellValue("2023/6/9");
                dataRow.createCell(15).setCellValue("2023/6/9");
                dataRow.createCell(16).setCellValue("2023/3/20 24:00");
                dataRow.createCell(17).setCellValue("");
                dataRow.createCell(18).setCellValue("");
                dataRow.createCell(19).setCellValue("");
                dataRow.createCell(20).setCellValue("否");
                dataRow.createCell(21).setCellValue("ph_update_dt");
                dataRow.createCell(22).setCellValue("不定时");
            }

            tablesRs.close();

            // 写入Excel文件
            workbook.write(outputStream);
        } finally {
            if (conn != null) {
                conn.close();
            }
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
        }
    }
}

标签:headerRow,null,java,String,数据库,createCell,dataRow,mysql,setCellValue
From: https://blog.51cto.com/yangqinglei/9617951

相关文章

  • 解密JavaChassis3:易扩展的多种注册中心支持
    本文分享自华为云社区《JavaChassis3技术解密:易扩展的多种注册中心支持》,作者:liubao68。JavaChassis的早期版本依赖于ServiceCenter,提供了很多差异化的竞争力:接口级别转发。通过注册中心管理微服务的每个版本的元数据,特别是契约数据。结合契约数据,能够实现版本级别的路由......
  • 深入浅出Java多线程(九):synchronized与锁
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第九篇内容:synchronized与锁。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代软件开发中,多线程技术是提升系统性能和并发能力的关键手段之一。Java作为主流的编程语言,其内置的多线程机制为开发者......
  • 重学数据库3
    多表操作(实际开发推荐,平常上课做的实验不这样做也行)多表设计1.一对多(多对一)2.多对多3.一对一一对多--外键创建表的时候createtable表名([constraint][外键名称]foreignkey(外键字段名)references主表(字段名));建完表后添加外键alter表名addconstraint......
  • Java中的 << , >> , 和 >>>所代表的含义
    Java中的<<,>>,和>>>所代表的含义标题Java中的<<,>>,和>>>所代表的含义1.<<表示左移运算符例如8<<1,表示将8向左移1位,低位补0,结果为16。例如8<<2,表示将8向左移2位,低位补0,结果为32。左移一位相当于乘以二二进制演算:8的二进制:1000向左移动两位结果为100000,换......
  • 对话苏光牛:国内数据库市场已进入关键转折点,2024年或是分水岭
    “中国数据库市场已进入关键阶段,2024年或是分水岭!”“目前,国内数据库产品数量接近300款,我们真的需要这么多数据库吗?”面对这个问题,华为云数据库业务CTO苏光牛不假思索地给出了他的见解:“不仅是中国市场,全球范围内,也不需要如此多的商业数据库。”他进一步预测,随着市场的自然淘汰......
  • 【转帖】解决Java/MySQL性能问题的思路
    plantegg.github.io/2023/08/28/解决问题思路/ 10年前写的,重新发一下系统性能问题CPU(基本上WEB服务器没有多少IO,主要是CPU有瓶颈)top/vmstat观察CPU使用率,Load负载,r/b线程数量等;IO(数据库大多数时候瓶颈是IO,主要是索引没建好;如果数据库CPU紧张的话,检查一下是不是orderb......
  • JAVA对象的成员方法
    方法介绍使用方法的好处......
  • JAVA对象和属性
    对象对象实例举例,快速认识对象创建一个对象==实例化一个对象==把类实例化点击查看代码/***@authorLittleBear*@date2024-02-05-21:47*/publicclassobject{publicstaticvoidmain(String[]args){Tt=newT("xxm",111);//对象实......
  • Java NIO
    NIO简介在传统的JavaI/O模型(BIO)中,I/O操作是以阻塞的方式进行的。也就是说,当一个线程执行一个I/O操作时,它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈,因为需要为每个连接创建一个线程,而线程的创建和切换都是有开销的。为了解决这个问题,在......
  • Java测试代码编写
    一、单元测试1.1引入依赖1、root<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><s......