当前位置: 首页 > news >正文

springboot:接手老项目,领导让更新数据库说明文档,如何3分钟完成任务

0 引言

最新在重新整理老项目的文档,其中数据库说明文档上一版更新还是在1年多前,文档中的数据结构说明与当前数据库严重脱节,所以更新数据库说明文档已经是迫在眉睫的事情了。

因为项目是一个比较大型且“年长‘的项目,涉及了多个数据库,N多张表,所以作为一个好(懒)的开发者,一张表一张表手写是不可能,当然可以通过sql导出表结构,但是依然很慢。

能不能有一个工具,能帮我自动生成数据库说明文档,当然是有的,今天我们就来说一说数据库中的swagger——screw组件

1. screw简介

screw是用来生成数据库表结构说明文档的组件,通过引用jar包,通过简单的配置就可以自动生成文档,相当于数据库中的swagger,支持html, word, md三种格式的文档

2. screw使用

1、创建springboot项目,引入依赖:

  • 因为我们要作为一个springboot web项目运行,所以引入spring web
  • 因为要使用mysql连接驱动器,所以引入mysql-connector-java
  • screw-coreHikariCP是screw组件使用需要的依赖
  • 最后,我们需要用单元测试的方式来调用生成文档的方法,所以需要spring-boot-starter-test依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- screw核心 -->
        <dependency>
            <groupId>cn.smallbun.screw</groupId>
            <artifactId>screw-core</artifactId>
            <version>1.0.5</version>
        </dependency>
        <!-- HikariCP -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.4.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2、application.yml配置文件配置数据库连接信息,同时开启xa.properties.useInformationSchema,该配置用于开启读取表注释(remarks)信息

spring:
  application:
    name: datebase_doc_demo
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    name: defaultDataSource
    url: jdbc:mysql://localhost:3306/bladex?serverTimezone=UTC
    username: root
    password: 123456
    xa:
      properties:
        useInformationSchema: true

3、创建生成文档代码

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 org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;

import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@SpringBootTest
class DatebaseDocDemoApplicationTests2 {

    @Autowired
    private ApplicationContext applicationContext;
    
    @Test
    void generateDBDoc2(){
        DataSource dataSource = applicationContext.getBean(DataSource.class);

        EngineConfig engineConfig = EngineConfig.builder()
                //生成文件路径
                .fileOutputDir("/Users/wuhanxue/Downloads")
                // 打开目录
                .openOutputDir(true)
                // 文件类型,支持word、md和html
                .fileType(EngineFileType.HTML)

                //生成模板实现,支持freemarker和velocity
                .produceType(EngineTemplateType.freemarker).build();

        //生成配置文档
        Configuration configuration = Configuration.builder()
                .version("1.0.0")
                .description("数据库说明文档")
                .dataSource(dataSource)
                .engineConfig(engineConfig)
                .produceConfig(getProcessConfig())
                .build();

        //执行生成
        new DocumentationExecute(configuration).execute();
    }

    /**
     * 配置想要生成的表 + 配置想要忽略的表
     * @return
     */
    private ProcessConfig getProcessConfig() {
        // 忽略表名
        List<String> ignoreTable = Arrays.asList("test_xxx");
        //忽略表前缀,如忽略a开头的数据库表
        List<String> ignorePrefix = Arrays.asList("test_");
        //忽略表后缀
        List<String> ignoreSuffix = Arrays.asList("_test");

        return ProcessConfig.builder()
                // 根据名称生成指定表
                .designatedTableName(new ArrayList<String>())
                // 根据表前缀生成
                .designatedTablePrefix(new ArrayList<String>())
                // 根据表后缀生成
                .designatedTableSuffix(new ArrayList<String>())
                // 忽略表名
                .ignoreTableName(ignoreTable)
                // 忽略表前缀
                .ignoreTablePrefix(ignorePrefix)
                // 忽略表后缀
                .ignoreTableSuffix(ignoreSuffix).build();
    }
}

当然这个是需要springboot项目的配置文件配置的,如果你是spring项目引入的,或者其他纯maven项目引入,也可以通过一下代码生成

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.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.util.ArrayList;

@SpringBootTest
class DatebaseDocDemoApplicationTests {

    @Test
    void generateDBDoc(){
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
        hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/bladex?serverTimezone=UTC");
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("123456");
        // 设置可以获取remark信息
        hikariConfig.addDataSourceProperty("useInformationSchema","true");
        hikariConfig.setMinimumIdle(2);
        hikariConfig.setMaximumPoolSize(5);
        DataSource dataSource = new HikariDataSource(hikariConfig);
        // 生成配置
        EngineConfig engineConfig = EngineConfig.builder()
                // 生成文件路径
                .fileOutputDir("/Users/wuhanxue/Downloads")
                // 打开目录 设置为true执行完代码后会自动打开对应路径文件夹
                .openOutputDir(true)
                // 文件类型,支持三种类型
//                .fileType(EngineFileType.HTML)
                .fileType(EngineFileType.WORD)
                // 生成模板实现
                .produceType(EngineTemplateType.freemarker).build();
        // 忽略表,这些表不会在文档中生成
        ArrayList<String> ignoreTableName = new ArrayList<>();
        ignoreTableName.add("test_xxx");
        // 忽略表前缀,这些表不会在文档中生成
        ArrayList<String> ignorePrefix = new ArrayList<>();
        ignorePrefix.add("test_");
        // 忽略表后缀,这些表不会在文档中生成
        ArrayList<String> ignoreSuffix = new ArrayList<>();
        ignoreSuffix.add("_test");
        ProcessConfig processConfig = ProcessConfig.builder()
                // 忽略表名
                .ignoreTableName(ignoreTableName)
                // 忽略表前缀
                .ignoreTablePrefix(ignorePrefix)
                // 忽略表后缀
                .ignoreTableSuffix(ignoreSuffix).build();
        // 配置
        Configuration config = Configuration.builder()
                // 版本
                .version("1.0.0")
                // 描述
                .description("数据库说明文档")
                // 数据源
                .dataSource(dataSource)
                // 生成配置
                .engineConfig(engineConfig)
                // 生成配置
                .produceConfig(processConfig).build();
        // 执行生成
        new DocumentationExecute(config).execute();
    }

}

4、运行测试

  • html格式

在这里插入图片描述

  • word格式

在这里插入图片描述

  • md格式

在这里插入图片描述

源码

文中源码可在如下地址下载:

git地址

总结

如上所示,我们的数据库说明文档就做完了,当然我在实际项目中的数据库比上述演示的要大的多,但数据库越大,我们省的时间就越多

但是大家也要把握screw组件的适用场景,有的人会觉得它很鸡肋,因为我们实际开发时是先写数据库设计文档,再开发的,但有的场景,比如接手老项目,或者项目迭代比较快的,数据库文档更新不及时时,就可以使用这个组件来帮助我们自动生成文档

这里大家还可以继续做拓展,将生成方法包装为一个接口,通过监控binlog中的DDL语句,来触发接口调用,从而实现自动生成数据库文档,可以通过生成html格式的,放到后台项目中,这样就实现了实时自动更新的数据库说明文档

相关文章:

  • 【IoT】产品设计:称重传感器选型指南
  • 【C语言进阶】 指针强化练习
  • 设备注册挂载流程(包含上电、使能、i2c通讯介绍)
  • 详解动态库静态库、动态链接静态链接
  • 1.5万字总结 Redis 常见面试题知识点
  • TCP/IP 网络模型有哪几层
  • JSP——分页查询
  • 经典算法之深度优先搜索(DFS)
  • Java EE|多线程之线程状态与线程安全
  • html实现酷炫的公司年会抽奖(附源码)
  • C# 实现为Tcp服务器设计访问黑名单、白名单
  • Esp8266+TFT太空人天气时钟
  • 【C++】STL六大组件之一——适配器(adapters)
  • 【网络攻击手段之----- DDOS攻击】
  • 【关于Linux中----进程间通信方式之管道】
  • .pyc 想到的一些问题
  • [笔记] php常见简单功能及函数
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 230. Kth Smallest Element in a BST
  • Apache Spark Streaming 使用实例
  • java中具有继承关系的类及其对象初始化顺序
  • Nacos系列:Nacos的Java SDK使用
  • python_bomb----数据类型总结
  • SpringCloud集成分布式事务LCN (一)
  • 爱情 北京女病人
  • 构建二叉树进行数值数组的去重及优化
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 将 Measurements 和 Units 应用到物理学
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 使用Swoole加速Laravel(正式环境中)
  • 听说你叫Java(二)–Servlet请求
  • 湖北分布式智能数据采集方法有哪些?
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​马来语翻译中文去哪比较好?
  • !!Dom4j 学习笔记
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (007)XHTML文档之标题——h1~h6
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (四)Controller接口控制器详解(三)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)Java算法:二分查找
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)程序员技术练级攻略
  • ****Linux下Mysql的安装和配置
  • . Flume面试题
  • ..回顾17,展望18
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core 中插件式开发实现
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅