Java實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語句的工具類
工具描述:一鍵獲取所有表的建表語句、一鍵獲取所有表的表字段設(shè)計(jì)
最后生成在項(xiàng)目的根路徑下:

說明:本工具類由于需要導(dǎo)出表格,因此需要用到我的Excel工具類。
詳見(Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出操作詳解)
工具類源碼:
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();
// 獲取全表的表設(shè)計(jì)
getAllTableFields();
}
/**
* 獲取全表設(shè)計(jì)
*/
private static void getAllTableFields() {
List<Object> head = new ArrayList<>();
head.add("表名稱");
head.add("字段名稱");
head.add("字段描述");
head.add("字段類型");
head.add("是否可空");
head.add("默認(rèn)值");
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("表設(shè)計(jì).xlsx");
ExcelUtils.exportFile(file, dataList);
System.out.println("表設(shè)計(jì).xlsx 生成完成?。?);
}
/**
* 獲取單個表設(shè)計(jì)
*
* @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;
}
/**
* 獲取所有數(shù)據(jù)表名
*
* @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;
}
/**
* 獲取數(shù)據(jù)庫鏈接
*
* @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;
}
}
/**
* 將內(nèi)容寫入到文件中
*
* @param file 文件
* @param content 內(nèi)容
*/
public static void writeFileContent(File file, String content) {
try (FileWriter writer = new FileWriter(file)) {
writer.write(content);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}到此這篇關(guān)于Java實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語句的工具類的文章就介紹到這了,更多相關(guān)Java Mysql工具類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何利用@PreAuthorize注解自定義權(quán)限校驗(yàn)
通過使用@PreAuthorize注解實(shí)現(xiàn)開放接口的權(quán)限校驗(yàn),具體步驟包括開啟全局方法安全、編寫自定義鑒權(quán)方法、創(chuàng)建自定義異常類、在統(tǒng)一異常處理類中捕獲異常并處理,最后在需要鑒權(quán)的接口上貼上注解2024-12-12
MAC 系統(tǒng)如何使用 Sublime Text 2 直接編譯運(yùn)行 java 代碼
這篇文章主要介紹了MAC 系統(tǒng)如何使用 Sublime Text 2 直接編譯運(yùn)行 java 代碼,需要的朋友可以參考下2014-10-10
eclipse導(dǎo)入工程報(bào)錯問題項(xiàng)目或者文件有紅叉的解決方案
這篇文章主要介紹了eclipse導(dǎo)入工程報(bào)錯問題項(xiàng)目或者文件有紅叉的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
詳解Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊和發(fā)現(xiàn)
這篇文章主要介紹了Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊和發(fā)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
java中l(wèi)ist使用時(shí)需避免的場景總結(jié)
眾所周知,Java為開發(fā)者提供了多種集合類的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯誤使用也會導(dǎo)致諸多問題,所以本文我們就來看一看幾個錯誤使用List的場景吧2023-10-10
Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Java中的i++與++i的實(shí)現(xiàn)原理詳解,在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1,它是一種簡潔且方便的方式來實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能,i++可以用于各種情況,本文來看一下其實(shí)現(xiàn)原理,需要的朋友可以參考下2023-10-10

