数据库表转为库表设计文档

开发完之后,就一大堆文档需要写的,其中就有库表设计文档,所以直接写个接口,直接把库表转为库表设计文档就行,省一大堆时间摸鱼了。直接贴代码。

pom文件引入依赖

<!--引入数据库表结构文档生成器Screw依赖-->
<dependency>
    <groupId>cn.smallbun.screw</groupId>
    <artifactId>screw-core</artifactId>
    <version>1.0.5</version>
</dependency>

新建controller类

import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.google.common.base.Splitter;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据库表转为库表设计文档,将数据库内的表生成数据库设计文档格式
 * @author lfq
 */
@RestController
@RequestMapping("/table")
public class TableToTableDocument {

    /**
     * screw配置的文件类型 HTML->HTML文件  WORD->WORD文件  MD->Markdown文件
     * 默认生成word文档
     */
    private static final EngineFileType FILE_OUTPUT_TYPE = EngineFileType.WORD;
    /** 文档输出地址 */
    private static final String fileOutputDir = "/data/tabledocument";
    /** 文档名称*/
    private static final String docFileName = "tabledocument";

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 生成数据库表结构文档
     */
    /**
     *
     * @param driverClassName 驱动
     * @param dbUrl 数据库URL   characterEncoding=UTF-8: 防止生成后文档乱码
     * @param dbUsername  数据库账号
     * @param dbPassword  数据库密码
     * @param ignoreTableName 忽略的表名,不需要生成的表,多个以英文逗号隔开
     * @param ignoreTablePrefix 忽略的表名前缀,多个以英文逗号隔开
     * @param generatorTableName 需要生成的表名,多个以英文逗号隔开
     * @param generatorTablePrefix 需要生成的表前缀,多个以英文逗号隔开
     */
    @GetMapping("/toTableDocument")
    public ResponseEntity<InputStreamResource> toTableDocument(String driverClassName, String dbUrl, String dbUsername, String dbPassword,
                                                               String ignoreTableName, String ignoreTablePrefix,
                                                               String generatorTableName, String generatorTablePrefix){
        DataSource dataSource;
       if (StringUtils.isNotBlank(driverClassName) && StringUtils.isNotBlank(dbUrl) && StringUtils.isNotBlank(dbUsername)
               && StringUtils.isNotBlank(dbPassword)){
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(driverClassName);
        hikariConfig.setJdbcUrl(dbUrl);
        hikariConfig.setUsername(dbUsername);
        hikariConfig.setPassword(dbPassword);
        hikariConfig.addDataSourceProperty("useInformationSchema", "true");
        hikariConfig.setMinimumIdle(2);
        hikariConfig.setMaximumPoolSize(5);
        dataSource = new HikariDataSource(hikariConfig);
        }else {
           //使用yml配置的数据源
           dataSource = applicationContext.getBean(DataSource.class);
       }
        //创建screw的引擎配置
        EngineConfig engineConfig = EngineConfig.builder()
                .fileOutputDir(fileOutputDir)
                .openOutputDir(false)
                .fileType(FILE_OUTPUT_TYPE)
                .produceType(EngineTemplateType.freemarker)
                .fileName(docFileName).build();

        //创建screw的配置:生成文档配置(包含以下自定义版本号、描述等配置连接)
        Configuration config = Configuration.builder()
                .version("1.0.0")
                .description("数据库设计文档生成")
                .dataSource(dataSource)
                .engineConfig(engineConfig)
                .build();
        if (StringUtils.isNotBlank(ignoreTableName) || StringUtils.isNotBlank(ignoreTablePrefix) || StringUtils.isNotBlank(generatorTableName)
                || StringUtils.isNotBlank(generatorTablePrefix)) {
            config.setProduceConfig(getProcessConfig(ignoreTableName, ignoreTablePrefix, generatorTableName, generatorTablePrefix));
        }
        new DocumentationExecute(config).execute();
        String filename = docFileName + ".doc";
        File file = new File(fileOutputDir + "/" + filename);
        if (file.exists()) {
            try {
                InputStream inputStream = new FileInputStream(file);
                if (inputStream != null) {
                    InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
                    HttpHeaders httpHeaders = new HttpHeaders();
                    ContentDisposition contentDisposition = ContentDisposition.builder("attachment")
                            .filename(new String(filename.getBytes("utf-8"), "iso-8859-1")).build();
                    httpHeaders.setContentDisposition(contentDisposition);
                    return ResponseEntity.ok().headers(httpHeaders).contentType(MediaType.APPLICATION_OCTET_STREAM)
                            .body(inputStreamResource);

                }
            } catch (Exception e) {}
        }
        return null;
    }

    /**
     * 配置想要生成的表、想要忽略的表
     * @return
     */
    private ProcessConfig getProcessConfig(String ignoreTableName, String ignoreTablePrefix,
                                           String generatorTableName, String generatorTablePrefix) {
        List<String> ignoreTableNameList = new ArrayList<>();
        List<String> ignoreTablePrefixList = new ArrayList<>();
        List<String> generatorTableNameList = new ArrayList<>();
        List<String> generatorTablePrefixList = new ArrayList<>();
        //忽略表
        if (StringUtils.isNotBlank(ignoreTableName)){
            ignoreTableNameList = Splitter.on(",").omitEmptyStrings().trimResults().splitToList(ignoreTableName);
        }
        //忽略表前缀,如忽略test_开头的数据库表
        if (StringUtils.isNotBlank(ignoreTablePrefix)){
            ignoreTablePrefixList = Splitter.on(",").omitEmptyStrings().trimResults().splitToList(ignoreTablePrefix);
        }
        // 需要生成数据库文档的表  如果generatorTablePrefix设置值不为空,则 generatorTableName 中的表名要去掉前缀,不然会重复生成,并且表名和字段注释有误
       if (StringUtils.isNotBlank(generatorTableName)){
           generatorTableNameList = Splitter.on(",").omitEmptyStrings().trimResults().splitToList(generatorTableName);
       }
        // 需要生成数据库文档的表前缀
        if (StringUtils.isNotBlank(generatorTablePrefix)){
            generatorTablePrefixList = Splitter.on(",").omitEmptyStrings().trimResults().splitToList(generatorTablePrefix);
        }
        //指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置
        ProcessConfig processConfig = ProcessConfig.builder()
                //根据名称指定表生成
                .designatedTableName(generatorTableNameList)
                //根据表前缀生成
                .designatedTablePrefix(generatorTablePrefixList)
                //忽略表名
                .ignoreTableName(ignoreTableNameList)
                //忽略表前缀
                .ignoreTablePrefix(ignoreTablePrefixList)
                .build();
        return processConfig;
    }
}

生成文档效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值