Java实现一键获取Mysql所有表字段设计和建表语句的工具类

 更新时间:2023年05月17日 17:01:12   作者:zyqok  
这篇文章主要为大家详细介绍了如何利用Java编写一个工具类,可以实现一键获取Mysql所有表字段设计和建表语句,感兴趣的小伙伴可以了解一下

工具描述:一键获取所有表的建表语句、一键获取所有表的表字段设计

最后生成在项目的根路径下:

说明:本工具类由于需要导出表格,因此需要用到我的Excel工具类。

详见(Java实现Excel导入导出操作详解

工具类源码:

package com.zyq.utils.mysql;
 
import com.zyq.utils.excel.ExcelUtils;
 
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.util.*;
 
/**
 * @author Yuanqiang.Zhang
 * @since 2023/4/11
 */
public class MySqlUtils {
 
    private static String ip = "127.0.0.1";
    private static int port = 3306;
    private static String db = "zyq";
    private static String username = "root";
    private static String password = "123456";
    private static Connection conn;
    private static Map<String, String> tables;
 
    static {
        conn = getConnection();
        tables = getAllTable();
    }
 
    public static void main(String[] args) {
        // 获取全表的建表语句
        getAllTableCreateSql();
        // 获取全表的表设计
        getAllTableFields();
    }
 
    /**
     * 获取全表设计
     */
    private static void getAllTableFields() {
        List<Object> head = new ArrayList<>();
        head.add("表名称");
        head.add("字段名称");
        head.add("字段描述");
        head.add("字段类型");
        head.add("是否可空");
        head.add("默认值");
        List<List<Object>> dataList = new ArrayList<>();
        dataList.add(head);
        int total = tables.size();
        int current = 0;
        for (Map.Entry<String, String> each : tables.entrySet()) {
            String tableName = each.getKey();
            List<List<Object>> tableFields = getTableFields(tableName);
            dataList.addAll(tableFields);
            current++;
            System.out.println(String.format("%s/%s %s 字段获取完成", current, total, tableName));
        }
        File file = new File("表设计.xlsx");
        ExcelUtils.exportFile(file, dataList);
        System.out.println("表设计.xlsx 生成完成!!");
    }
 
    /**
     * 获取单个表设计
     *
     * @param tableName 单个表名
     * @return List<List < Object>>
     */
    private static List<List<Object>> getTableFields(String tableName) {
        String sql = "SELECT * FROM information_schema.columns WHERE table_schema = '" + db + "' AND table_name = '" + tableName + "'";
        List<List<Object>> fields = new ArrayList<>();
        try {
            Statement stat = conn.createStatement();
            ResultSet rs = stat.executeQuery(sql);
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                String columnDefault = rs.getString("COLUMN_DEFAULT");
                String columnComment = rs.getString("COLUMN_COMMENT");
                String isNullable = rs.getString("IS_NULLABLE");
                String columnType = rs.getString("COLUMN_TYPE");
                List<Object> column = new ArrayList<>();
                column.add(tableName);
                column.add(columnName);
                column.add(columnComment);
                column.add(columnType);
                column.add(isNullable);
                column.add(columnDefault);
                fields.add(column);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return fields;
    }
 
    /**
     * 获取所有表的建表语句
     */
    private static void getAllTableCreateSql() {
        StringBuilder sb = new StringBuilder();
        int total = tables.size();
        int current = 0;
        for (Map.Entry<String, String> each : tables.entrySet()) {
            String tableName = each.getKey();
            String tableComment = each.getValue();
            String desc = "";
            if (Objects.nonNull(tableComment) && !tableComment.trim().isEmpty()) {
                desc = String.format("-- %s(%s)", tableName, tableComment);
            } else {
                desc = String.format("-- %s", tableName);
            }
            String createTableSql = getCreateTableSql(tableName);
            sb.append(desc).append("\n");
            sb.append(createTableSql).append("\n\n");
            current++;
            System.out.println(String.format("%s/%s %s 建表SQL获取完成", current, total, tableName));
        }
        File file = new File("create_tables.sql");
        writeFileContent(file, sb.toString());
        System.out.println("create_tables.sql 文件生成!!");
    }
 
    /**
     * 获取某张表的建表语句
     *
     * @param tableName 表名
     * @return 建表语句
     */
    private static String getCreateTableSql(String tableName) {
        String sql = "SHOW CREATE TABLE " + tableName;
        String createTableSql = "";
        try {
            Statement stat = conn.createStatement();
            ResultSet rs = stat.executeQuery(sql);
            while (rs.next()) {
                createTableSql = rs.getString("Create Table") + ";";
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return createTableSql;
    }
 
    /**
     * 获取所有数据表名
     *
     * @return Map<表名, 备注>
     */
    private static Map<String, String> getAllTable() {
        String sql = "SHOW TABLE status";
        Map<String, String> map = new LinkedHashMap<>();
        try {
            Statement stat = conn.createStatement();
            ResultSet rs = stat.executeQuery(sql);
            while (rs.next()) {
                String name = rs.getString("name");
                String comment = rs.getString("comment");
                map.put(name, comment);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return map;
    }
 
 
    /**
     * 获取数据库链接
     *
     * @return Connection
     */
    private static Connection getConnection() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = String.format("jdbc:mysql://%s:%s/%s", ip, port, db);
            return DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
 
    /**
     * 将内容写入到文件中
     *
     * @param file    文件
     * @param content 内容
     */
    public static void writeFileContent(File file, String content) {
        try (FileWriter writer = new FileWriter(file)) {
            writer.write(content);
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}

到此这篇关于Java实现一键获取Mysql所有表字段设计和建表语句的工具类的文章就介绍到这了,更多相关Java Mysql工具类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JVM自定义类加载器在代码扩展性实践分享

    JVM自定义类加载器在代码扩展性实践分享

    这篇文章主要介绍了JVM自定义类加载器在代码扩展性实践分享,一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化 、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接
    2022-06-06
  • Java的泛型擦除和运行时泛型信息获取方式

    Java的泛型擦除和运行时泛型信息获取方式

    Java泛型在编译时会发生类型擦除,即泛型参数被替换为它们的限定类型(如Object),这使得ArrayList<Integer>和ArrayList<String>在运行时类型相同,尽管如此,我们可以通过定义类或匿名内部类的方式在运行时获取泛型信息
    2024-09-09
  • Java模拟扑克牌洗牌实现生成52张扑克的方法示例

    Java模拟扑克牌洗牌实现生成52张扑克的方法示例

    这篇文章主要介绍了Java模拟扑克牌洗牌实现生成52张扑克的方法,涉及Java数组遍历、重排及输出等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • synchronized 和 Lock 的异同点(如何让选择)

    synchronized 和 Lock 的异同点(如何让选择)

    这篇文章主要介绍了 synchronized和Lock的异同点(如何让选择),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java利用SPI实现解耦的示例详解

    Java利用SPI实现解耦的示例详解

    SPI的全称是服务提供接口,可以用其来启动框架的扩展和替换组件。本文将利用SPI实现解耦,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-04-04
  • Spring的@Lazy懒加载注解用法详细解析

    Spring的@Lazy懒加载注解用法详细解析

    这篇文章主要介绍了Spring的@Lazy懒加载注解用法详细解析,SpringIoC容器会在启动的时候实例化所有单实例 bean ,如果我们想要实现 Spring 在启动的时候延迟加载 bean,即在首次调用bean的时候再去执行初始化,就可以使用 @Lazy 注解来解决这个问题,需要的朋友可以参考下
    2023-11-11
  • Java中多态的实现原理详细解析

    Java中多态的实现原理详细解析

    这篇文章主要介绍了Java中多态的实现原理详细解析,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定,需要的朋友可以参考下
    2024-01-01
  • java基础开发泛型类的详解

    java基础开发泛型类的详解

    这篇文章为大家介绍了java基础开发中泛型类的详解,包括泛型的概念以及应用实例有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • Java包装类的缓存机制原理实例详解

    Java包装类的缓存机制原理实例详解

    这篇文章主要介绍了Java包装类的缓存机制原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java如何对map进行排序详解(map集合的使用)

    java如何对map进行排序详解(map集合的使用)

    这篇文章主要介绍了java如何对map进行排序,java map集合的使用详解,大家可以参考使用
    2013-12-12

最新评论