对于API的文档,我们有Swagger等工具来自动生成了。但有有一类文档还是常常困扰着我们,那就是数据库表结构的文档。相信很多同学都有过手写数据库表结构文档 的经历吧?常规操作就是一通无脑的 CV 大法,产出一份小几十页的 Word 文档。

那么,是否有什么工具,可以帮我们偷懒高效的自动 生成数据库表结构文档呢?

还真有!下面就来介绍这样一个工具:screw!

2. screw 简介

screw 是一个简洁好用的数据库表结构文档的生成工具 ,支持 MySQL、Oracle、PostgreSQL 等主流的关系数据库。

screw 的仓库地址是 https://github.com/pingfangushi/screw,感兴趣的胖友,可以研究一波。

生成的文档有 HTML、Word、Markdown 三种格式 ,示例如下图所示:

格式
HTML
Word
Markdown

如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

3. 快速入门

screw 有两种方式 来生成文档,通过 Java 代码 或者 Maven 插件 。

下面,我们来分别快速入门下。

3.1 使用 Java 代码的方式

创建 lab-70-db-doc-screw-01 示例项目,使用 screw 的 Java 代码 的方式,生成文档。

示例示例

3.1.1 引入依赖

在 pom.xml 文件中,引入 screw 的依赖 screw-core

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>lab-70-db-doc</artifactId><groupId>cn.iocoder.springboot.labs</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>lab-70-db-doc-screw-01</artifactId><dependencies><!-- screw 库,简洁好用的数据库表结构文档生成器 --><dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0.5</version></dependency><!-- 数据库连接 --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>3.4.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency></dependencies></project>

依赖 HikariCP 和 mysql-connector-java 是为了连接 MySQL 数据库。

3.1.2 ScrewMain

创建 ScrewMain 类,使用 screw 生成文档。代码如下:

public class ScrewMain {private static final String DB_URL = "jdbc:mysql://400-infra.server.iocoder.cn:3306";private static final String DB_NAME = "mall_system";private static final String DB_USERNAME = "root";private static final String DB_PASSWORD = "3WLiVUBEwTbvAfsh";private static final String FILE_OUTPUT_DIR = "/Users/yunai/screw_test";private static final EngineFileType FILE_OUTPUT_TYPE = EngineFileType.HTML; // 可以设置 Word 或者 Markdown 格式private static final String DOC_FILE_NAME = "数据库文档";private static final String DOC_VERSION = "1.0.0";private static final String DOC_DESCRIPTION = "文档描述";public static void main(String[] args) {// 创建 screw 的配置Configuration config = Configuration.builder().version(DOC_VERSION)  // 版本.description(DOC_DESCRIPTION) // 描述.dataSource(buildDataSource()) // 数据源.engineConfig(buildEngineConfig()) // 引擎配置.produceConfig(buildProcessConfig()) // 处理配置.build();// 执行 screw,生成数据库文档new DocumentationExecute(config).execute();}/*** 创建数据源*/private static DataSource buildDataSource() {// 创建 HikariConfig 配置类HikariConfig hikariConfig = new HikariConfig();hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");hikariConfig.setJdbcUrl(DB_URL + "/" + DB_NAME);hikariConfig.setUsername(DB_USERNAME);hikariConfig.setPassword(DB_PASSWORD);hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息// 创建数据源return new HikariDataSource(hikariConfig);}/*** 创建 screw 的引擎配置*/private static EngineConfig buildEngineConfig() {return EngineConfig.builder().fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径.openOutputDir(false) // 打开目录.fileType(FILE_OUTPUT_TYPE) // 文件类型.produceType(EngineTemplateType.freemarker) // 文件类型.fileName(DOC_FILE_NAME) // 自定义文件名称.build();}/*** 创建 screw 的处理配置,一般可忽略* 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置*/private static ProcessConfig buildProcessConfig() {return ProcessConfig.builder().designatedTableName(Collections.<String>emptyList())  // 根据名称指定表生成.designatedTablePrefix(Collections.<String>emptyList()) //根据表前缀生成.designatedTableSuffix(Collections.<String>emptyList()) // 根据表后缀生成.ignoreTableName(Arrays.asList("test_user", "test_group")) // 忽略表名.ignoreTablePrefix(Collections.singletonList("test_")) // 忽略表前缀.ignoreTableSuffix(Collections.singletonList("_test")) // 忽略表后缀.build();}}

代码比较简单,胖友看看注释即可。

比较重要的变量,已经抽取成静态 变量,胖友看着修改哈。

3.1.3 简单测试

执行 ScrewMain 程序,进行文档的生成。这里我们生成的是 HTML 文档,效果如下图所示:

HTML 文档

3.2 使用 Maven 插件的方式

创建 lab-70-db-doc-screw-02 示例项目,使用 screw 的 Maven 插件 的方式,生成文档。

示例示例

3.2.1 引入插件

在 pom.xml 文件中,引入 screw 的插件 screw-maven-plugin

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>lab-70-db-doc</artifactId><groupId>cn.iocoder.springboot.labs</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>lab-70-db-doc-screw-02</artifactId><build><plugins><plugin><groupId>cn.smallbun.screw</groupId><artifactId>screw-maven-plugin</artifactId><version>1.0.5</version><dependencies><!-- 数据库连接 --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>3.4.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency></dependencies><configuration><!-- 数据库相关配置 --><driverClassName>com.mysql.cj.jdbc.Driver</driverClassName><jdbcUrl>jdbc:mysql://400-infra.server.iocoder.cn:3306/mall_system</jdbcUrl><username>root</username><password>3WLiVUBEwTbvAfsh</password><!-- screw 配置 --><fileType>HTML</fileType><title>数据库文档</title> <!--标题--><fileName>测试文档名称</fileName> <!--文档名称 为空时:将采用[数据库名称-描述-版本号]作为文档名称--><description>数据库文档生成</description> <!--描述--><version>${project.version}</version> <!--版本--><openOutputDir>false</openOutputDir> <!--打开文件输出目录--><produceType>freemarker</produceType> <!--生成模板--></configuration><executions><execution><phase>compile</phase><goals><goal>run</goal></goals></execution></executions></plugin></plugins></build></project>

Maven 插件的配置项 比较少,胖友按需修改下 <configuration/> 即可。

3.2.2 简单测试

执行 screw-maven-plugin 插件,会在 doc 目录下生成文档。如下图所示:

执行 Maven 插件

4. 生成实体类

screw 的实现原理,是基于数据库中的表结构 ,生成对应的文档。

那么,是否可以自动 生成 Java 实体类呢?答案是可以的,在 screw-extension 项目中,拓展 提供了该功能。

这样,日常开发中,在我们完成数据库的建表 之后,可以直接生成对应的 Java 实体类,避免枯燥的重复劳动。

下面,我们来快速入门下。创建 lab-70-db-doc-screw-03 示例项目,使用 screw 的 Java 代码 的方式,生成 Java 实体类。

示例示例

4.1 引入依赖

在 pom.xml 文件中,额外 引入 screw 的依赖 screw-extension

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>lab-70-db-doc</artifactId><groupId>cn.iocoder.springboot.labs</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>lab-70-db-doc-screw-03</artifactId><dependencies><!-- screw 库,简洁好用的数据库表结构文档生成器 --><dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0.5</version></dependency><dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-extension</artifactId><version>1.0.5</version></dependency><!-- 数据库连接 --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>3.4.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency></dependencies></project>

友情提示:由于 screw-extension 项目处于初步开发阶段,暂时未将该依赖推到 Maven 中央仓库,所以需要自己克隆项目,进行编译打包到本地。

4.2 ScrewMain

创建 ScrewMain 类,使用 screw 生成 Java 实体类。代码如下:

public class ScrewMain {private static final String DB_URL = "jdbc:mysql://400-infra.server.iocoder.cn:3306";private static final String DB_NAME = "mall_system";private static final String DB_USERNAME = "root";private static final String DB_PASSWORD = "3WLiVUBEwTbvAfsh";private static final String FILE_OUTPUT_DIR = "/Users/yunai/screw_test";private static final String JAVA_CLASS_PACKAGE = "cn.iocoder.dataobject";public static void main(String[] args) {// 创建 screw 的配置PojoConfiguration config = PojoConfiguration.builder().path(FILE_OUTPUT_DIR) // 生成 POJO 相关的目录.packageName(JAVA_CLASS_PACKAGE) // 包名.nameStrategy(new HumpNameStrategy()) // 包名策略.useLombok(false) // 是否使用 Lombok.dataSource(buildDataSource()) // 数据源.processConfig(buildProcessConfig()) // 处理配置.build();// 执行 screw,生成 POJO 实体类new PojoExecute(config).execute();}/*** 创建数据源*/private static DataSource buildDataSource() {// 创建 HikariConfig 配置类HikariConfig hikariConfig = new HikariConfig();hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");hikariConfig.setJdbcUrl(DB_URL + "/" + DB_NAME);hikariConfig.setUsername(DB_USERNAME);hikariConfig.setPassword(DB_PASSWORD);hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息// 创建数据源return new HikariDataSource(hikariConfig);}/*** 创建 screw 的处理配置,一般可忽略* 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置*/private static ProcessConfig buildProcessConfig() {return ProcessConfig.builder().designatedTableName(Collections.<String>emptyList())  // 根据名称指定表生成.designatedTablePrefix(Collections.<String>emptyList()) //根据表前缀生成.designatedTableSuffix(Collections.<String>emptyList()) // 根据表后缀生成.ignoreTableName(Arrays.asList("test_user", "test_group")) // 忽略表名.ignoreTablePrefix(Collections.singletonList("test_")) // 忽略表前缀.ignoreTableSuffix(Collections.singletonList("_test")) // 忽略表后缀.build();}}

代码比较简单,胖友看看注释即可。不同于上面的快速入门,这里我们使用 PojoConfiguration 作为配置类,使用 PojoExecute 作为执行器。

比较重要的变量,已经抽取成静态 变量,胖友看着修改哈。

如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

4.3 简单测试

执行 ScrewMain 程序,进行 Java 实体类的生成。效果如下图所示:

Java 实体类

生成的 Java 实体类的成员属性 还不太正确,需要等待作者进行下修复。

666. 彩蛋

至此,我们已经完成 screw 的学习,一起来简单总结下:

  • screw 支持生成数据库表结构文档 ,通过 Java 代码或者 Maven 插件的方式。

  • screw 支持生成 Java 实体类 ,通过 screw-extension 提供。

初略喵了下 screw 的代码,总体代码量在 5000+ 行,核心代码在 2000 行左右。项目分层干净,代码注释完成,胖友可以选择阅读了解下。这样,我们可以根据我们实际项目的需要,进行二次开发 。

往期推荐

被前公司辞退后,前领导打电话命令你给前同事解释代码,该怎么办?

国庆第一天:先换个头像,然后分享下国庆学习计划吧!

Spring Boot 实现扫码登录,这种方式太香了!!

这是什么神仙公司?居然公布离职员工信息,还给差评?

“80后的人,真的该退出IT行业了”,某IT公司领导言论惹争议!

技术交流群

最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!

点击阅读原文,送你免费Spring Boot教程!

数据库界的Swagger:一键生成数据库文档!你不了解一下?相关推荐

  1. swagger php修改成中文,PHP使用swagger自动生成API文档

    使用 swagger 自动生成 API 文档 使用 swagger 自动生成 API 文档,有需要的朋友可以参考下. 一.下载 swagger-ui 直接上传服务器 二.下载 swagger-php ...

  2. 一键生成 API 文档的妙招

    一般接口文档编写完成后,就要开始编写调用接口的代码,很多开发团队都采用传统的通过接口文档的方式来编写接口.但在接口数量越来越多的当下,手写接口十分麻烦. 今天我们通过 Eolink 演示一种一键生成 ...

  3. 一键生成PDF文档的书签和目录(书签,目录页带页码 都行)

    转自:https://blog.csdn.net/u010391342/article/details/86681359 一键生成PDF文档的书签目录 原创codeing_doc 发布于2019-01 ...

  4. Swagger的生成接口文档

    Swagger的生成接口文档 一.背景 前后端之间约定好使用Restful风格的API进行数据通信,此时如果我们能够提供一份清晰明了的接口文档,能够极大的提高效率,既满足我们输出文档的需要又能随代码的 ...

  5. 开发者必备工具,一键生成接口文档、调用示例

    前言 开发中,接口文档很重要,特别是现在web开发都开始前后端分离了,更加需要一个好的接口文档. 那要怎么快速的出接口文档.调用示例.mock呢?如果太麻烦,很多人就不愿意去写了. 今天给大家介绍一个 ...

  6. 超详细!使用swagger自动生成Api文档(swagger-ui)

    介绍 swagger是什么? swagger-ui 使用swagger-ui 简单使用 swagger api注解 本文参考: 介绍 这里是一些介绍,如果想直接看如何使用,请直接跳过这部分.但如果有时 ...

  7. admin.php生成地址,FastAdmin命令行一键生成API文档

    一键生成API文档 FastAdmin中的一键生成API文档可以在命令行或后台一键生成我们API接口的接口测试文档,可以直接在线模拟接口请求,查看参数示例和返回示例. 准备工作 请确保你的API模块下 ...

  8. springboot 集成 swagger 自动生成API文档

    Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.简单来说,Swagger是一个功能强大的接口管理工具,并且提供了多种编程语言的前后端分离解决方案. S ...

  9. 通过Swagger快速生成接口文档

    1.添加依赖: 在pom中添加swagger的依赖,这里使用的swagger版本为2.7.0,springboot相应版本为2.0.3,jdk1.8 示例如下: <swagger.version ...

  10. 【mysql系列】一键生成mysql文档

    前言:我们有时候在编写文档的时候会涉及到数据库表结构,如何建完表之后将表的文档一键生成呢? 一.pom引入screw <!-- screw核心 --><dependency>& ...

最新文章

  1. 转:常用的几种加密算法以及java实现
  2. 安卓开发——锁定软件——输入密码后重复弹出输入密码窗口的解决方法
  3. SkyWalking 观测 Service Mesh 技术大公开
  4. python uwsgi_python nginx+uwsgi+WSGI 处理请求详解
  5. 游戏开发之友元类和友元函数(C++基础)
  6. iOS开发日记29-UIAlertController
  7. BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】
  8. 微型计算机中的存储容量1TB等于,自考计算机应用基础_通关宝典
  9. 网格划分——Mesh操作
  10. linux清除网络记录,Linux清除用户登录记录和命令历史方法
  11. html背景颜色渐变色代码,css3背景渐变色代码
  12. 模拟测试数据的生成方法
  13. org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates
  14. react中的 .d.ts
  15. 未来交通 | 中国二十城出行者“MaaS及共享出行体验”初探索
  16. For循环—函数初步概念
  17. Oracle GoldenGate 文章集合
  18. java.net.Url类的应用
  19. 怎样解决移动硬盘提示格式化的问题
  20. 招聘中求职者关心哪些问题?

热门文章

  1. 实现 ASP.NET 网站地图提供者
  2. linux 内核钩子 khook 项目介绍
  3. java struts2 表达式语言 ognl 简介
  4. centos7 xfce 中文字体输入法
  5. linux Makefile中 make -C和M=的作用
  6. python3 raise 抛出异常
  7. Linux makefile 教程
  8. #include iostream与#include iostream.h的区别
  9. CentOS-7.2部署Squid服务
  10. 安装mysql总是未响应状态_求助啊 WIN7下安装mysql出问题 老是说未响应~!!