最近項目快了驗收踩麦,那么接下來就是寫一些比較煩人的文檔壳猜,在寫數(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é)果如下:
現(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é)果如下:
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é)果如下:
有了如上知識峻呕,加上前面我們準(zhǔn)備的表和列的數(shù)據(jù),就可以根據(jù)任意模版生成對應(yīng)的表數(shù)據(jù)和列數(shù)據(jù)了趣效。下一篇我將介紹如何創(chuàng)建word模版瘦癌。