以前在项目完成后都会按照要求写数据库设计文档,表少的时候还无所谓,当有上百张表的时候就不好写了。当然也有一些自动化软件可以帮我们实现这个功能,但是自定义的程度比较低。所以今天自己来实现这个功能,可以按照自己的喜好定义样式和模板,是不是很酷。
首先新建一个Word文档
然后另存为xml格式,用NotePad打开。
在xml中使用freemarker的标签将数据填充。不会freemarker的可以先自己研究一下。
//循环遍历所有table
<#list tables as table>
表名
:
${table.tableName}
注释
:
${table.tableComment}
列名
数据类型
约束
允许空
备注
<#list table.columns as column>
${column.columnName}
${column.columnType}
${column.columnKey}
${column.isNullable}
${column.columnComment}
#list>
#list>
关键部分到了,从数据库中获取所有的表信息并将数据填充到模板中生成doc文件。
package com.dwl.mindoc.service;
import com.dwl.mindoc.dao.BaseDao;
import com.dwl.mindoc.database.BaseFactory;
import com.dwl.mindoc.database.Database;
import com.dwl.mindoc.domain.TableVo;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ResourceUtils;
import javax.annotation.PostConstruct;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @program: mindoc
* @description: generator
* @author: daiwenlong
* @create: 2018-10-13 13:00
**/
@Service
public class GenerateService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private BaseFactory factory;
@Autowired
private BaseDao dao;
@PostConstruct
public void genertator(){
try {
Database base = factory.getDataBase();
List tables = dao.getTables(base);
tables.forEach(table->{
table.setColumns(dao.getColumns(base,table.getTableName()));
logger.info("mindoc - TableName:{} TableComment:{} loading...",table.getTableName(),table.getTableComment());
});
makeDoc(tables);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成doc
* @param tables
* @return
* @throws IOException
* @throws TemplateException
*/
public void makeDoc(List tables){
logger.info("mindoc - makeDoc Satrting...");
// 第一步:创建一个Configuration对象。
Configuration configuration = new Configuration(Configuration.getVersion());
// 第二步:设置模板文件所在的路径。
try {
configuration.setDirectoryForTemplateLoading(ResourceUtils.getFile("classpath:"));
// 第三步:设置模板文件使用的字符集。
configuration.setDefaultEncoding("utf-8");
// 第四步:加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate("doc.xml");
// 第五步:创建一个模板使用的数据集。
Map dataModel = new HashMap<>();
dataModel.put("tables",tables);
//生成文件放在项目根目录下
File outFile = new File(System.getProperty("user.dir")+"\\DatabaseDesign.doc");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
// 第六步:调用模板对象的process方法输出文件。
template.process(dataModel, out);
logger.info("mindoc - MakeDoc succeeded.");
logger.info("mindoc - Doc directory {}",outFile);
} catch (IOException |TemplateException e) {
logger.warn("mindoc - MakeDoc failed.");
}
}
}
查看控制台信息,文件已经生成。
我们去文件目录下查看文档。
是不是很方便,终于可以随心所欲的写Word了。除了能生成数据库设计文档,我们还可以生成其他有固定模式的Word文档,大家可以根据自己业务场景试一试。
上面只贴了一部分代码,详细代码可以到github上下载mindoc