自動生成數(shù)據(jù)庫表設(shè)計(二)之Freemarker的基本使用

最近項目快了驗收踩麦,那么接下來就是寫一些比較煩人的文檔壳猜,在寫數(shù)據(jù)庫設(shè)計文檔時勾徽,到了詳細(xì)設(shè)計這一塊有點尷尬了,每張表统扳,沒個字段都要寫上去喘帚,由于前期沒有整理,所以這個工作量還是很大咒钟,我查看了我們的數(shù)據(jù)庫發(fā)現(xiàn)有353張表吹由,這樣寫,得花多久的時間啊朱嘴。倾鲫。。于是想通過程序來自動完成萍嬉,這就是這篇文章的核心乌昔。

系列文章:
自動生成數(shù)據(jù)庫表設(shè)計(一)之獲取JDBC獲取元數(shù)據(jù)
自動生成數(shù)據(jù)庫表設(shè)計(二)之Freemarker的基本使用
自動生成數(shù)據(jù)庫表設(shè)計(三)之制作word模版

本篇主要內(nèi)容:
1、Freemarker的使用
2壤追、Freemarker的List的使用
3磕道、Freemarker的List嵌套List的使用

Freemarker簡單使用

1、引入freemarker依賴

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>

2行冰、引入Freemarker的工具類

public class FtUtil {
    /**
     * 獲取模板
     *
     * @param templatesDir 例如"/templates"
     * @return
     */
    public Template getTemplate(String templatesDir, String name) {
        try {
            //通過Freemaker的Configuration讀取相應(yīng)的ftl
            Configuration cfg = new Configuration();
            //設(shè)定去哪里讀取相應(yīng)的ftl模板文件
            cfg.setClassForTemplateLoading(this.getClass(), templatesDir);
            //在模板文件目錄中找到名稱為name的文件
            Template temp = cfg.getTemplate(name);
            return temp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * Description: 根據(jù)模版生成文件 <br/>
     */
    public void generateFile(String templatesDir, String templateName, Map root, String outDir, String outFileName) {
        FileWriter out = null;
        try {
            //通過一個文件輸出流溺蕉,就可以寫到相應(yīng)的文件中
            out = new FileWriter(new File(outDir, outFileName));
            Template temp = this.getTemplate(templatesDir, templateName);
            temp.process(root, out);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3伶丐、在resources下新建test.ftl文件

<#-- 這是Freemarker注釋 -->
<#-- 獲取簡單值 -->
${table}

這里就是簡單的取變量為table的值,下面我們就是用這個模版文件生成文件

4焙贷、測試 生成文件

public class TestFreemaker {
    public static void main(String[] args) throws Exception {
        Map map = new HashMap<>();
        map.put("table", "123");

        FtUtil ftUtil = new FtUtil();
        ftUtil.generateFile("/", "test.ftl", map, "D:/", "test.txt");
    }
}

這里給變量table設(shè)置了值123撵割,生成文件將會顯示123,就說明我們已經(jīng)會使用Freemarker了辙芍,運行結(jié)果如下:

test.txt

現(xiàn)在我們已經(jīng)可以取單個變量了啡彬,下面我們看在模版里取集合的應(yīng)用

Freemarker中List的使用

1、遍歷List的用法如下:

<#-- List使用 -->
<#list table as t>
序號:${t_index}   表名:${t.NAME}
</#list>

其中table表示List,而t是List里的元素故硅, t_index是表示t這個元素在list中的下標(biāo)庶灿,t.NAME是表示取名為NAME的屬性值

2、修改Main方法

    public static void main(String[] args) throws Exception {

        //模擬一張表
        Map<String, Object> table = new HashMap<>();
        table.put("NAME", "T_USER");

        //模擬一個表集合
        List<Map<String, Object>> tableList = new ArrayList<>();
        tableList.add(table);

        Map map = new HashMap<>();
        //map.put("table", "123");
        map.put("table", tableList);


        FtUtil ftUtil = new FtUtil();
        ftUtil.generateFile("/", "test.ftl", map, "D:/", "test.txt");
    }

結(jié)果如下:

test.txt

Freemarker中List嵌套List的使用

1吃衅、修改test.ftl如下:

<#-- List嵌套List的使用 -->
<#list table as t>
序號:${t_index}   表名:${t.NAME}
    <#list t.COLUMNS as c>
    序號:${c_index}   列名:${c.NAME}
    </#list>
</#list>

其中t對象里多了一個屬性COLUMNS往踢,這個COLUMNS也是一個集合

2、修改Main方法

public static void main(String[] args) throws Exception {

        //模擬2個列ID徘层、AGE
        Map<String, Object> column1 = new HashMap<>();
        column1.put("NAME", "ID");
        Map<String, Object> column2 = new HashMap<>();
        column2.put("NAME", "AGE");

        //模擬一個列集合
        List<Map<String, Object>> columnList = new ArrayList<>();
        columnList.add(column1);
        columnList.add(column2);

        //模擬一張表
        Map<String, Object> table = new HashMap<>();
        table.put("NAME", "T_USER");
        table.put("COLUMNS", columnList);

        //模擬一個表集合
        List<Map<String, Object>> tableList = new ArrayList<>();
        tableList.add(table);

        Map map = new HashMap<>();
        //map.put("table", "123");
        map.put("table", tableList);


        FtUtil ftUtil = new FtUtil();
        ftUtil.generateFile("/", "test.ftl", map, "D:/", "test.txt");
    }

運行結(jié)果如下:

test.ftl

有了如上知識峻呕,加上前面我們準(zhǔn)備的表和列的數(shù)據(jù),就可以根據(jù)任意模版生成對應(yīng)的表數(shù)據(jù)和列數(shù)據(jù)了趣效。下一篇我將介紹如何創(chuàng)建word模版瘦癌。

文檔下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跷敬,隨后出現(xiàn)的幾起案子讯私,更是在濱河造成了極大的恐慌,老刑警劉巖西傀,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斤寇,死亡現(xiàn)場離奇詭異,居然都是意外死亡拥褂,警方通過查閱死者的電腦和手機娘锁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饺鹃,“玉大人致盟,你說我怎么就攤上這事∮任浚” “怎么了馏锡?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伟端。 經(jīng)常有香客問我杯道,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任党巾,我火速辦了婚禮萎庭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘齿拂。我一直安慰自己驳规,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布署海。 她就那樣靜靜地躺著吗购,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砸狞。 梳的紋絲不亂的頭發(fā)上捻勉,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音刀森,去河邊找鬼踱启。 笑死,一個胖子當(dāng)著我的面吹牛研底,可吹牛的內(nèi)容都是我干的埠偿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼榜晦,長吁一口氣:“原來是場噩夢啊……” “哼胚想!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芽隆,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎统屈,沒想到半個月后胚吁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡愁憔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年腕扶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吨掌。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡半抱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膜宋,到底是詐尸還是另有隱情窿侈,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布秋茫,位于F島的核電站史简,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肛著。R本人自食惡果不足惜圆兵,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一跺讯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殉农,春花似錦刀脏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聪建,卻和暖如春钙畔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背金麸。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工擎析, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挥下。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓揍魂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棚瘟。 傳聞我的和親對象是個殘疾皇子现斋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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