java讀取mysql數(shù)據(jù)庫結構棺滞,并生成Markdown標記語言文本

結構說明

項目結構非常簡單将饺,主要就creator下的3個類,讀取數(shù)據(jù)庫后記錄的數(shù)據(jù)庫結構信息保存到txt文件夾下战转,??表對應??txt文件搜立。

1502862396067.jpg

Column.java 字段

package creator;

public class Column {
    // 數(shù)據(jù)庫字段名稱
    private String field;
    // 服務端model屬性名稱
    private String param;
    // 數(shù)據(jù)庫字段類型
    private String type;
    // 數(shù)據(jù)庫字段注釋
    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 {
    // 數(shù)據(jù)庫表名
    private String tableName;
    // 服務端model名
    private String objectName;
    // 數(shù)據(jù)庫表的建表語句
    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數(shù)據(jù)庫下表的結構信息
 */
public class Runner {

    public static void main(String[] args) throws Exception {
        // 獲取數(shù)據(jù)庫下的所有表名稱
        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("|參數(shù)|類型|說明|\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();
            }
        }
    }

    /**
     * 連接數(shù)據(jù)庫
     */
    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;
    }

    /**
     * 獲取當前數(shù)據(jù)庫下的所有表名稱
     */
    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);
    }
}

結果示例

生成的數(shù)據(jù)庫結構數(shù)據(jù)為Markdown標記語言風格的文本。

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

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

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

參數(shù) 類型 說明
id int(11)
createDtm datetime [創(chuàng)建時間]
nickname varchar(255) [昵稱]
address varchar(255) [聯(lián)系地址]
phone varchar(12) [電話]
contact varchar(255) [聯(lián)系方式]
email varchar(255) [郵箱]
headImg varchar(255) [頭像]
password varchar(40) [密碼]
sex int(2) [性別] 0:保密 1:男 2:女
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末槐秧,一起剝皮案震驚了整個濱河市儒拂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌色鸳,老刑警劉巖社痛,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異命雀,居然都是意外死亡蒜哀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撵儿,“玉大人乘客,你說我怎么就攤上這事〉硇” “怎么了易核?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浪默。 經(jīng)常有香客問我牡直,道長,這世上最難降的妖魔是什么纳决? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任碰逸,我火速辦了婚禮,結果婚禮上阔加,老公的妹妹穿的比我還像新娘饵史。我一直安慰自己,他們只是感情好胜榔,可當我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布胳喷。 她就那樣靜靜地躺著,像睡著了一般夭织。 火紅的嫁衣襯著肌膚如雪厌蔽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天摔癣,我揣著相機與錄音奴饮,去河邊找鬼。 笑死择浊,一個胖子當著我的面吹牛戴卜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琢岩,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼投剥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了担孔?” 一聲冷哼從身側(cè)響起江锨,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糕篇,沒想到半個月后啄育,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡拌消,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年挑豌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡氓英,死狀恐怖侯勉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铝阐,我是刑警寧澤址貌,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站徘键,受9級特大地震影響练对,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啊鸭,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一锹淌、第九天 我趴在偏房一處隱蔽的房頂上張望匿值。 院中可真熱鬧赠制,春花似錦、人聲如沸挟憔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绊谭。三九已至政恍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間达传,已是汗流浹背篙耗。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪赶,地道東北人宗弯。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像搂妻,于是被迫代替她去往敵國和親蒙保。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容