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

news2024/11/26 10:37:57

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

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 MySQL驱动
     * @param dbUrl 数据库URL   characterEncoding=UTF-8: 防止生成后文档乱码
     * @param dbUsername  MySQL数据库账号
     * @param dbPassword  MySQL数据库密码
     * @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;
    }
}

生成文档效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《驾驭未来:大型语言模型的理论与实践》—— 探索大模型的奥秘

在这个信息爆炸的时代&#xff0c;人工智能尤其是大型语言模型&#xff08;LLM&#xff09;已经成为推动科技进步的关键力量。无论是科学研究、商业应用还是日常生活&#xff0c;大型语言模型都在不断地改变着我们的世界。对于那些渴望深入了解这一前沿技术的人来说&#xff0c…

JAVA实现单词词频统计-辅助英文考试学习

一、基于GUI的可以自行输入的英文单词词频统计软件

SpingBoot集成kafka发送读取消息

SpingBoot集成kafka开发 kafka的几个常见概念 1、springboot和kafka对应版本&#xff08;重要&#xff09;2、创建springboot项目&#xff0c;引入kafka依赖2.1、生产者EventProducer2.2、消费者EventConsumer2.3、启动生产者的方法SpringBoot01KafkaBaseApplication2.4、appli…

小程序学习day10-自定义组件的data数据、方法、属性,data与properties的关系、自定子组件之数据监听器

39、WXS脚本&#xff08;小程序独有的一套脚本语言&#xff09;&#xff08;续&#xff09; &#xff08;6&#xff09;自定义组件的data数据、方法、属性 1&#xff09;自定义组件的data数据&#xff08;在小程序组件中&#xff0c;用于组件模版渲染的私有数据&#xff09; …

定格精彩瞬间!详解六自由度技术原理及应用

在体育赛事中&#xff0c;观赏各项目的精彩瞬间&#xff0c;欣赏运动员的卓越表现是观众们最为关注的焦点。以体操跳马为例&#xff0c;运动员们全力助跑&#xff0c;然后奋力起跳、腾空&#xff0c;接着精准的推手和转体动作&#xff0c;最后稳稳落地&#xff0c;整个动作行云…

【JAVA CORE_API】Day19 多线程API(2)、多线程并发安全问题、同步

多线程API 进程和线程 进程&#xff1a;进程就像是一个程序在电脑里运行时的一个实例。你可以把它想象成一个独立的小工人&#xff0c;专门负责完成某项任务&#xff08;比如打开浏览器、播放音乐&#xff09;。每个进程都有自己独立的资源&#xff08;比如内存&#xff09;和…

python 可迭代,迭代器,生成器,装饰器

1. 可迭代&#xff08;Iterable&#xff09; 可迭代 是指一个对象可以返回一个迭代器的对象。也就是说&#xff0c;它实现了 __iter__() 方法或 __getitem__() 方法。常见的可迭代对象有列表、元组、字符串、字典和集合。 from collections.abc import Iterablei 100 s &qu…

墙裂推荐!云上机密计算,阿里云上体验了一下海光内存加密和远程认证

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 机密计算目录 前言1、构…

哈希原理实现

本节主要看源代码实现 哈希特点 哈希&#xff08;Hashing&#xff09;是一种将数据映射到固定大小的表中以实现快速查找的数据结构和算法方法。哈希的主要特点包括&#xff1a; 1. 高效的查找、插入和删除 时间复杂度&#xff1a;哈希表通常提供近乎常数时间的查找、插入和…

app安全评估报告的常见留存措施(内附独家资料)

对用户账号、操作时间、操作类型、网络源地址和目标地址、网络源端口、客户端硬件特征等日志信息以及用户发布信息记录的留存措施 1**. 用户账号信息**&#xff1a;我们将用户账号信息安全存储&#xff0c;只有授权的人员能够访问。这些信息包括用户名、电子邮件地址等&#xf…

【C++ 面试 - 面向对象】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

VAuditDemo审计之二次注入漏洞

目录 VAuditDemo二次注入漏洞 搜索危险函数&#xff0c;用户可控点 regCheck.php messageSub.php message.php 漏洞调用链 漏洞错误利用过程 注册用户 xxxx, 发表payload留言 漏洞正确利用过程 注册用户 wwww\ 退出用户 wwww\\ 使用 wwww\ 登录 发表留言 替换dat…

《javaEE篇》--定时器

定时器概念 当我们不需要某个线程立刻执行&#xff0c;而是在指定时间点或指定时间段之后执行&#xff0c;假如我们要定期清理数据库里的一些信息时&#xff0c;如果每次都手动清理的话就太麻烦&#xff0c;所以就可以使用定时器。定时器就可以比作一个闹钟&#xff0c;可以让…

C++ 设计模式(6. 适配器模式)

适配器模式Adapter Pattern是一种结构型设计模式&#xff0c;它可以将一个类的接口转换成客户希望的另一个接口&#xff0c;主要目的是充当两个不同接口之间的桥梁&#xff0c;使得原本接口不兼容的类能够一起工作。基本结构 Target 是目标接口&#xff0c;Adaptee 是需要适配的…

微信小程序实例代码解读

以微信 小程序开发工具给的示例代码为例&#xff1a; 主页代码&#xff1a; index.wxml 这个文件是一个微信小程序页面的 WXML 结构,主要功能是展示一个快速开始教程的步骤和内容。 源代码&#xff1a; <!--index.wxml--> <view class"container">&l…

ZK-Rollups测评

1. 引言 Matter Labs团队和多个高校研究人员一起&#xff0c;发布2024年论文《Analyzing and Benchmarking ZK-Rollups》&#xff0c;开源代码见&#xff1a; https://github.com/StefanosChaliasos/zkrollup-benchmarking&#xff08;Python&#xff09; 其中&#xff1a; …

安装MySQL入门基础指令

一.安装MySQL(以5.7版本为例) 1.一路默认安装&#xff0c;截图供大家参考 修改自己window安装名字即可 2.配置环境变量 C:\Program Files\MySQL\MySQL Server 5.7\bin 写入系统环境变量即可在window窗口使用其服务了 3.登录MySQL服务 进入控制台输入命令 mysql -u root …

运维小技能:基于Windows系统和‌Linux系统,以tomcat为案例,讲解如何新增自启动服务。

文章目录 引言‌I Linux系统‌(以CentOS为例)基础知识:运行级别(run level)基于chkconfig 工具,设置服务启动类型。基于systemctl 新增系统服务II 基于Windows系统设置服务自启动的常规操作安装多个tomcat服务,并设置自启动。III 扩展制定定时任务优化停止Tomcat服务命令引…

ESP32Cam人工智能教学20

ESP32Cam人工智能教学20 ESP32Cam专用APP 这次我们专门为ESP32Cam量身定制一个手机APP。手机APP是客户端&#xff0c;利用Socket连接ESP32Cam&#xff0c;ESP32Cam成了服务器&#xff0c;实现Socket全双工的数据传输模式&#xff0c;还可以一边显示摄像头图像&#xff0c;一边…

【Canvas与诗词】北岛诗《献给遇罗克》节选(以太阳的名义...)

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>以太阳的名义</title><style type"text/css">…