java讀取mysql數據庫結構,并生成Markdown標記語言文本

結構說明

項目結構非常簡單,主要就creator下的3個類,讀取數據庫后記錄的數據庫結構信息保存到txt文件夾下,??表對應??txt文件。

1502862396067.jpg

Column.java 字段

package creator;

public class Column {
    // 數據庫字段名稱
    private String field;
    // 服務端model屬性名稱
    private String param;
    // 數據庫字段類型
    private String type;
    // 數據庫字段注釋
    private String comment;

    public Column(String field, String param, String type, String comment) {
        this.field = field;
        this.param = param;
        this.type = type;
        this.comment = comment;
    }
    // 此處省略getter setter
}

Table.java 表

package creator;

import java.util.List;

public class Table {
    // 數據庫表名
    private String tableName;
    // 服務端model名
    private String objectName;
    // 數據庫表的建表語句
    private String comment;
    // 表包含的字段
    private List<Column> columns;

    public Table(String tableName, String objectName) {
        this.tableName = tableName;
        this.objectName = objectName;
    }
    // 此處省略getter setter
}

Runner.java 運行類

package creator;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * 讀取mysql數據庫下表的結構信息
 */
public class Runner {

    public static void main(String[] args) throws Exception {
        // 獲取數據庫下的所有表名稱
        List<Table> tables = getAllTableName();
        // 獲得表的建表語句
        buildTableComment(tables);
        // 獲得表中所有字段信息
        buildColumns(tables);
        // 寫文件
        write(tables);
    }

    /**
     * 寫文件
     */
    private static void write(List<Table> tables) {
        for (Table table : tables) {
            System.out.println(table.getTableName());
            StringBuilder buffer = new StringBuilder();
            buffer.append("**表名:**" + table.getTableName() + "\n");
            buffer.append("**對象:**" + table.getObjectName() + "\n");
            buffer.append("**說明:**" + table.getComment() + "\n\n");
            buffer.append("------------\n");
            buffer.append("|參數|類型|說明|\n");
            buffer.append("|:-------|:-------|:-------|\n");
            List<Column> columns = table.getColumns();
            for (Column column : columns) {
                String param = column.getParam();
                if ("del".equals(param) || "delDtm".equals(param)) continue;
                String type = column.getType();
                String comment = column.getComment();
                buffer.append("|" + param + "|" + type + "|" + ("".equals(comment) ? "無" : comment) + "|\n");
            }
            String content = buffer.toString();
            String path = System.getProperty("user.dir") + "/creator/txt/" + table.getObjectName() + ".txt";
            try {
                content = content.replaceAll("'", "\"");
                FileUtils.writeStringToFile(new File(path), content);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 連接數據庫
     */
    private static Connection getMySQLConnection() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
        return conn;
    }

    /**
     * 獲取當前數據庫下的所有表名稱
     */
    private static List<Table> getAllTableName() throws Exception {
        List<Table> tables = new ArrayList<>();
        Connection conn = getMySQLConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SHOW TABLES");
        while (rs.next()) {
            String tableName = rs.getString(1);
            String objectName = camelCase(tableName);
            Table table = new Table(tableName, objectName);
            tables.add(table);
        }
        rs.close();
        stmt.close();
        conn.close();
        return tables;
    }

    /**
     * 獲得某表的建表語句
     */
    private static void buildTableComment(List<Table> tables) throws Exception {
        Connection conn = getMySQLConnection();
        Statement stmt = conn.createStatement();
        for (Table table : tables) {
            ResultSet rs = stmt.executeQuery("SHOW CREATE TABLE " + table.getTableName());
            if (rs != null && rs.next()) {
                String createDDL = rs.getString(2);
                String comment = parse(createDDL);
                table.setComment(comment);
            }
            if (rs != null) rs.close();
        }
        stmt.close();
        conn.close();
    }

    /**
     * 獲得某表中所有字段信息
     */
    private static void buildColumns(List<Table> tables) throws Exception {
        Connection conn = getMySQLConnection();
        Statement stmt = conn.createStatement();
        for (Table table : tables) {
            List<Column> columns = new ArrayList<>();
            ResultSet rs = stmt.executeQuery("show full columns from " + table.getTableName());
            if (rs != null) {
                while (rs.next()) {
                    String field = rs.getString("Field");
                    String type = rs.getString("Type");
                    String comment = rs.getString("Comment");
                    Column column = new Column(field, camelCase(field), type, comment);
                    columns.add(column);
                }
            }
            if (rs != null) {
                rs.close();
            }
            table.setColumns(columns);
        }
        stmt.close();
        conn.close();
    }

    /**
     * 返回注釋信息
     */
    private static String parse(String all) {
        String comment;
        int index = all.indexOf("COMMENT='");
        if (index < 0) {
            return "";
        }
        comment = all.substring(index + 9);
        comment = comment.substring(0, comment.length() - 1);
        return comment;
    }

    /**
     * 例如:employ_user_id變成employUserId
     */
    private static String camelCase(String str) {
        String[] str1 = str.split("_");
        int size = str1.length;
        String str2;
        StringBuilder str4 = null;
        String str3;
        for (int i = 0; i < size; i++) {
            if (i == 0) {
                str2 = str1[i];
                str4 = new StringBuilder(str2);
            } else {
                str3 = initcap(str1[i]);
                str4.append(str3);
            }
        }
        return str4.toString();
    }

    /**
     * 把輸入字符串的首字母改成大寫
     */
    private static String initcap(String str) {
        char[] ch = str.toCharArray();
        if (ch[0] >= 'a' && ch[0] <= 'z') {
            ch[0] = (char) (ch[0] - 32);
        }
        return new String(ch);
    }
}

結果示例

生成的數據庫結構數據為Markdown標記語言風格的文本。

**表名:**user
**對象:**user
**說明:**用戶

------------
|參數|類型|說明|
|:-------|:-------|:-------|
|id|int(11)|無|
|createDtm|datetime|[創建時間]|
|nickname|varchar(255)|[昵稱]|
|address|varchar(255)|[聯系地址]|
|phone|varchar(12)|[電話]|
|contact|varchar(255)|[聯系方式]|
|email|varchar(255)|[郵箱]|
|headImg|varchar(255)|[頭像]|
|password|varchar(40)|[密碼]|
|sex|int(2)|[性別] 0:保密 1:男 2:女 |

將其使用Markdown風格展示效果為

參數 類型 說明
id int(11)
createDtm datetime [創建時間]
nickname varchar(255) [昵稱]
address varchar(255) [聯系地址]
phone varchar(12) [電話]
contact varchar(255) [聯系方式]
email varchar(255) [郵箱]
headImg varchar(255) [頭像]
password varchar(40) [密碼]
sex int(2) [性別] 0:保密 1:男 2:女
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容