自动生成数据库表设计(二)之Freemarker的基本使用

最近项目快了验收,那么接下来就是写一些比较烦人的文档,在写数据库设计文档时,到了详细设计这一块有点尴尬了,每张表,没个字段都要写上去,由于前期没有整理,所以这个工作量还是很大,我查看了我们的数据库发现有353张表,这样写,得花多久的时间啊。。。于是想通过程序来自动完成,这就是这篇文章的核心。

系列文章:
自动生成数据库表设计(一)之获取JDBC获取元数据
自动生成数据库表设计(二)之Freemarker的基本使用
自动生成数据库表设计(三)之制作word模版

本篇主要内容:
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读取相应的ftl
            Configuration cfg = new Configuration();
            //设定去哪里读取相应的ftl模板文件
            cfg.setClassForTemplateLoading(this.getClass(), templatesDir);
            //在模板文件目录中找到名称为name的文件
            Template temp = cfg.getTemplate(name);
            return temp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * Description: 根据模版生成文件 <br/>
     */
    public void generateFile(String templatesDir, String templateName, Map root, String outDir, String outFileName) {
        FileWriter out = null;
        try {
            //通过一个文件输出流,就可以写到相应的文件中
            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设置了值123,生成文件将会显示123,就说明我们已经会使用Freemarker了,运行结果如下:

test.txt

现在我们已经可以取单个变量了,下面我们看在模版里取集合的应用

Freemarker中List的使用

1、遍历List的用法如下:

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

其中table表示List,而t是List里的元素, t_index是表示t这个元素在list中的下标,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");
    }

结果如下:

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");
    }

运行结果如下:

test.ftl

有了如上知识,加上前面我们准备的表和列的数据,就可以根据任意模版生成对应的表数据和列数据了。下一篇我将介绍如何创建word模版。

文档下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容