当前位置:网站首页>数据库表结构文档 生成工具screw的使用
数据库表结构文档 生成工具screw的使用
2022-08-03 06:23:00 【12程序猿】
目录
一、screw介绍
日常的开发工作中,经常会和数据库打交道,在某些场景可能会需要数据库表结构的文档,今天分享个简洁好用的数据库表结构文档生成工具screw。
1.简介
screw是一个简洁好用的数据库表结构文档的生成工具 。
screw目前支持MySQL、Oracle、SqlServer、MariaDB、PostgreSQL等数据库,生成文档目前支持html、word、markdown文档格式。
github: GitHub - pingfangushi/screw: 简洁好用的数据库表结构文档生成器
gitee: screw: 简洁好用的数据库表结构文档工具,支持MySQL/MariaDB/SqlServer/Oracle/PostgreSQL/TIDB/CacheDB 数据库。
2.特点
screw的特点:
- 简洁、轻量、设计良好
- 多数据库支持
- 多种格式文档
- 灵活扩展
- 支持自定义模板
3.文档格式
生成文档目前支持html、word、markdown文档格式。
- html

- word

- markdown

二、生成方式
下面以MySQL数据库为例来简单介绍下。
新建测试库test及表t_user、t_product。
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`age` int(10) DEFAULT NULL COMMENT '年龄',
`remarks` varchar(255) DEFAULT NULL COMMENT '备注',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_user` varchar(255) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_user` varchar(255) DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
CREATE TABLE `t_product` (
`product_id` int(11) NOT NULL,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`sub_title` varchar(255) DEFAULT NULL COMMENT '副标题',
`sale_price` decimal(10,2) DEFAULT NULL COMMENT '商品售价',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` int(11) DEFAULT NULL COMMENT '创建者',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`update_by` int(11) DEFAULT NULL COMMENT '修改者',
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';
2.1 方式1:使用 Java 代码
2.1.1 引入依赖
引入screw的maven依赖:
<!--引入数据库表结构文档生成器Screw依赖-->
<dependency>
<groupId>cn.smallbun.screw</groupId>
<artifactId>screw-core</artifactId>
<version>1.0.5</version>
</dependency>
除此之外,还需引入数据库相关的依赖:
<!-- Hikari数据库连接池 也可采用阿里巴巴的Druid、C3p0等数据库连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
2.1.2 编写代码
package com.example.screwdemo.utils;
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 javax.sql.DataSource;
import java.util.ArrayList;
/** * @author qzz */
public class DocumentGenerator {
//以下static final修饰的参数 如果是基于SpringBoot项目,可以在配置文件中配置,通过@Value注解获取
/** * MySQL驱动 6.0以前的使用com.mysql.jdbc.Driver,6.0以后的使用com.mysql.cj.jdbc.Driver 我这边使用的是mysql-5.7.25版本的 */
private static final String Driver_Class_Name = "com.mysql.jdbc.Driver";
/** * 数据库URL characterEncoding=UTF-8: 防止生成后文档乱码 */
private static final String DB_URL = "jdbc:mysql://localhost:3306/test?&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSl=false";
/** * MySQL数据库账号密码 */
private static final String DB_USERNAME = "root";
private static final String DB_PASSWORD = "root";
/** * 生成数据库文档文件路径 可根据本机电脑自行配置 */
private static final String FILE_OUTPUT_DIR = "F:\\dbDoc\\";
/** * screw配置的文件名称,即数据库文档名称 */
private static final String DOC_FILE_NAME = "数据库设计文档生成";
/** * screw配置的文件类型 HTML->HTML文件 WORD->WORD文件 MD->Markdown文件 */
private static final EngineFileType FILE_OUTPUT_TYPE = EngineFileType.WORD;
/** * 版本 */
private static final String DOC_VERSION = "1.0.0";
/** * 描述 */
private static final String DOC_DESCRIPTION = "数据库设计文档生成";
public static void main(String[] args) {
generatorDocument();
}
public static void generatorDocument() {
//数据源 创建HikariConfig配置类
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(Driver_Class_Name);
hikariConfig.setJdbcUrl(DB_URL);
hikariConfig.setUsername(DB_USERNAME);
hikariConfig.setPassword(DB_PASSWORD);
//#设置useInformationSchema 可以获取tables表注释信息 即解决数据库表和列字段有说明、生成文档没有说明
hikariConfig.addDataSourceProperty("useInformationSchema", "true");
hikariConfig.setMinimumIdle(2);
hikariConfig.setMaximumPoolSize(5);
DataSource dataSource = new HikariDataSource(hikariConfig);
//创建screw的引擎配置
EngineConfig engineConfig = EngineConfig.builder()
//生成文件路径
.fileOutputDir(FILE_OUTPUT_DIR)
//打开目录
.openOutputDir(true)
//文件类型 HTML->HTML文件 WORD->WORD文件 MD->Markdown文件
.fileType(FILE_OUTPUT_TYPE)
//生成模板实现
.produceType(EngineTemplateType.freemarker)
//自定义文件名称,即数据库文档名称
.fileName(DOC_FILE_NAME).build();
//创建screw的处理配置,可忽略
//忽略表
ArrayList<String> ignoreTableName = new ArrayList<>();
ignoreTableName.add("test_user");
ignoreTableName.add("test_group");
//忽略表前缀
ArrayList<String> ignorePrefix = new ArrayList<>();
ignorePrefix.add("test_");
//忽略表后缀
ArrayList<String> ignoreSuffix = new ArrayList<>();
ignoreSuffix.add("_test");
// 需要生成数据库文档的表 如果designatedTablePrefix设置值不为空,则 designatedTableName 中的表名要去掉前缀,不然会重复生成,并且表名和字段注释有误
ArrayList<String> designatedTableName = new ArrayList<>();
// designatedTableName.add("user");
// designatedTableName.add("product");
// 需要生成数据库文档的表前缀
ArrayList<String> designatedTablePrefix = new ArrayList<>();
designatedTablePrefix.add("t_");
ProcessConfig processConfig = ProcessConfig.builder()
//指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置
//根据名称指定表生成
// .designatedTableName(new ArrayList<>())
.designatedTableName(designatedTableName)
//根据表前缀生成
// .designatedTablePrefix(new ArrayList<>())
.designatedTablePrefix(designatedTablePrefix)
//根据表后缀生成
.designatedTableSuffix(new ArrayList<>())
//忽略表名
.ignoreTableName(ignoreTableName)
//忽略表前缀
.ignoreTablePrefix(ignorePrefix)
//忽略表后缀
.ignoreTableSuffix(ignoreSuffix).build();
//创建screw的配置
Configuration config = Configuration.builder()
//版本
.version(DOC_VERSION)
//描述
.description(DOC_DESCRIPTION)
//数据源
.dataSource(dataSource)
//生成配置
.engineConfig(engineConfig)
//生成配置
.produceConfig(processConfig)
.build();
//执行screw,生成数据库文档
new DocumentationExecute(config).execute();
}
}
注意点:
- 如果要生成数据库中的所有表的数据库文档,
可忽略screw的处理配置 - 如果要生成指定表的数据库文档,
需要配置screw的处理配置,可指定表名、指定表前缀 - 指定表名、指定表前缀的使用:
- 如果指定表名
designatedTableName中的表名 已包含表的前缀,则无需配置指定表的前缀; - 如果指定表名
designatedTableName中的表名 不包含表的前缀,则需配置指定表的前缀;
- 如果指定表名
示例:
如数据库中存在表t_user 和 t_product等多张表,要求只导出t_user 和 t_product的数据库文档,screw的处理配置中的指定表与指定表的前缀的处理方式有如下两种:
方式一:指定表
// 需要生成数据库文档的表
ArrayList<String> designatedTableName = new ArrayList<>();
designatedTableName.add("t_user");
designatedTableName.add("t_product");
方式二:指定表与指定表的前缀
// 需要生成数据库文档的表
ArrayList<String> designatedTableName = new ArrayList<>();
designatedTableName.add("user");
designatedTableName.add("product");
// 需要生成数据库文档的表前缀
ArrayList<String> designatedTablePrefix = new ArrayList<>();
designatedTablePrefix.add("t_");
2.1.3 测试

2.2 方式2:使用 Spring Boot 整合screw
2.2.1 引入依赖
引入screw的maven依赖:
<!--引入数据库表结构文档生成器Screw依赖-->
<dependency>
<groupId>cn.smallbun.screw</groupId>
<artifactId>screw-core</artifactId>
<version>1.0.5</version>
</dependency>
除此之外,还需引入数据库相关的依赖:
<!-- Hikari数据库连接池 也可采用阿里巴巴的Druid、C3p0等数据库连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
2.2.2 配置数据源信息
application.yml:
# 服务端口
server:
port: 8083
# 数据源配置
spring:
datasource:
name: test
url: jdbc:mysql://localhost:3306/test?&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSl=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
xa:
properties:
#设置useInformationSchema 可以获取tables表注释信息 即解决数据库表和列字段有说明、生成文档没有说明
useInformationSchema: true
# 生成数据库文档文件路径
FILE_OUTPUT_DIR: F:\dbDoc\
# 版本
DOC_VERSION: 1.0.0
# screw配置的文件名称,即数据库文档名称
DOC_FILE_NAME: xx数据库设计文档
# 描述
DOC_DESCRIPTION: 数据库设计文档生成
2.2.3 编写代码
generatorService.java:
package com.example.screwdemo.service;
/** * 生成 数据库表结构文档 * @author qzz */
public interface GeneratorService {
/** * 生成 数据库表结构文档 */
void generatorDocument();
}
generatorServiceImpl.java:
package com.example.screwdemo.service.impl;
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.example.screwdemo.service.GeneratorService;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
import java.util.ArrayList;
/** * 生成 数据库表结构文档 * @author qzz */
@Service
public class GeneRatorServiceImpl implements GeneratorService {
@Autowired
private ApplicationContext applicationContext;//注入应用上下文
/** * MySQL驱动 */
@Value("${spring.datasource.driver-class-name}")
private String Driver_Class_Name;
/** * 数据库URL characterEncoding=UTF-8: 防止生成后文档乱码 */
@Value("${spring.datasource.url}")
private String DB_URL;
/** * MySQL数据库账号密码 */
@Value("${spring.datasource.username}")
private String DB_USERNAME = "root";
@Value("${spring.datasource.password}")
private String DB_PASSWORD = "root";
/** * 生成数据库文档文件路径 可根据本机电脑自行配置 */
@Value("${FILE_OUTPUT_DIR}")
private String FILE_OUTPUT_DIR;
/** * 版本 */
@Value("${DOC_VERSION}")
private String DOC_VERSION;
/** * screw配置的文件类型 HTML->HTML文件 WORD->WORD文件 MD->Markdown文件 */
private static final EngineFileType FILE_OUTPUT_TYPE = EngineFileType.WORD;
/** * screw配置的文件名称,即数据库文档名称 */
@Value("${DOC_FILE_NAME}")
private String DOC_FILE_NAME;
/** * 描述 */
@Value("${DOC_DESCRIPTION}")
private String DOC_DESCRIPTION;
/** * 生成 数据库表结构文档 */
@Override
public void generatorDocument() {
//获取数据源 此方法报No qualifying bean of type 'javax.sql.DataSource' available
// DataSource dataSource = applicationContext.getBean(DataSource.class);
//获取数据源 创建HikariConfig配置类
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(Driver_Class_Name);
hikariConfig.setJdbcUrl(DB_URL);
hikariConfig.setUsername(DB_USERNAME);
hikariConfig.setPassword(DB_PASSWORD);
//#设置useInformationSchema 可以获取tables表注释信息 即解决数据库表和列字段有说明、生成文档没有说明
hikariConfig.addDataSourceProperty("useInformationSchema", "true");
hikariConfig.setMinimumIdle(2);
hikariConfig.setMaximumPoolSize(5);
DataSource dataSource = new HikariDataSource(hikariConfig);
//创建screw的引擎配置
EngineConfig engineConfig = EngineConfig.builder()
//生成文件路径
.fileOutputDir(FILE_OUTPUT_DIR)
//打开目录
.openOutputDir(true)
//文件类型 HTML->HTML文件 WORD->WORD文件 MD->Markdown文件
.fileType(FILE_OUTPUT_TYPE)
//生成模板实现
.produceType(EngineTemplateType.freemarker)
//自定义文件名称,即数据库文档名称
.fileName(DOC_FILE_NAME).build();
//创建screw的配置:生成文档配置(包含以下自定义版本号、描述等配置连接)
Configuration config = Configuration.builder()
//版本
.version(DOC_VERSION)
//描述
.description(DOC_DESCRIPTION)
//数据源
.dataSource(dataSource)
//生成配置
.engineConfig(engineConfig)
//生成配置
.produceConfig(getProcessConfig())
.build();
//执行screw,生成数据库文档
new DocumentationExecute(config).execute();
}
/** * 配置想要生成的表、想要忽略的表 * @return */
private ProcessConfig getProcessConfig() {
//创建screw的处理配置,可忽略
//忽略表
ArrayList<String> ignoreTableName = new ArrayList<>();
ignoreTableName.add("test_user");
ignoreTableName.add("test_group");
//忽略表前缀,如忽略test_开头的数据库表
ArrayList<String> ignorePrefix = new ArrayList<>();
ignorePrefix.add("test_");
//忽略表后缀
ArrayList<String> ignoreSuffix = new ArrayList<>();
ignoreSuffix.add("_test");
// 需要生成数据库文档的表 如果designatedTablePrefix设置值不为空,则 designatedTableName 中的表名要去掉前缀,不然会重复生成,并且表名和字段注释有误
ArrayList<String> designatedTableName = new ArrayList<>();
// designatedTableName.add("user");
// designatedTableName.add("product");
// 需要生成数据库文档的表前缀
ArrayList<String> designatedTablePrefix = new ArrayList<>();
designatedTablePrefix.add("t_");
//指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置
ProcessConfig processConfig = ProcessConfig.builder()
//根据名称指定表生成
// .designatedTableName(new ArrayList<>())
.designatedTableName(designatedTableName)
//根据表前缀生成
// .designatedTablePrefix(new ArrayList<>())
.designatedTablePrefix(designatedTablePrefix)
//根据表后缀生成
.designatedTableSuffix(new ArrayList<>())
//忽略表名
.ignoreTableName(ignoreTableName)
//忽略表前缀
.ignoreTablePrefix(ignorePrefix)
//忽略表后缀
.ignoreTableSuffix(ignoreSuffix).build();
return processConfig;
}
}
编写controller测试方法:
package com.example.screwdemo.controller;
import com.example.screwdemo.service.GeneratorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** * 数据库表结构文档生成工具 * @author qzz */
@RestController
@RequestMapping("/generator")
public class GeneratorController {
@Autowired
private GeneratorService generatorService;
/** * 生成数据库表结构文档 */
@RequestMapping("/generatorDocument")
public void generatorDocument(){
generatorService.generatorDocument();
}
}
2.2.4 启动测试
postman 获取浏览器输入 链接 http://localhost:8083/generator/generatorDocument,执行效果:

三、完整代码
可点击此处下载
边栏推荐
- CDGA|如何加强数字政府建设?
- 华为设备配置BFD多跳检测
- El - tree set using setCheckedNodessetCheckedKeys default check nodes, and a new check through setChecked specified node
- 阿里云-武林头条-建站小能手争霸赛
- docker-compose部署mysql
- el-tree设置利用setCheckedNodessetCheckedKeys默认勾选节点,以及通过setChecked新增勾选指定节点
- MySQL 日期时间类型精确到毫秒
- Umi 4 快速搭建项目
- 关于NOI 2022的报到通知
- Docker-compose安装mysql
猜你喜欢
![mysql 数据去重的三种方式[实战]](/img/37/ad4007a32d9eb563a303756785e72f.png)
mysql 数据去重的三种方式[实战]

Cesium loads offline maps and offline terrain

重量级大咖来袭:阿里云生命科学与智能计算峰会精彩内容剧透

解决登录vCenter提示“当前网站安全证书不受信任“

信息学奥赛一本通T1450:Knight Moves

El - tree to set focus on selected highlight highlighting, the selected node deepen background and change the font color, etc

mysql慢查询优化

MYSQL存储过程注释详解

神经网络原理及代码实现

华为设备配置BFD状态与接口状态联动
随机推荐
分布式数据库数据一致性的原理、与技术实现方案
现货黄金分析的主要流派
Detailed explanation of AutoInt network and pytorch reproduction
pyspark --- 统计多列的众数并一次返回
关于利用canvas画带箭头的直线旋转
empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=NoneType),
链表之打基础--基本操作(必会)
信息学奥赛一本通T1448:深搜的剪枝技巧 电路维修
pyspark---对suuid区间编码(基于曝光数、点击数)
关于Attention的超详细讲解
伦敦银现货市场如何使用多条均线?
Getting started with el-tabs (tab bar)
pyspark --- count the mode of multiple columns and return it at once
Getting Started with Chrome Plugin Development
力扣解法汇总622-设计循环队列
unity 摄像机旋转拖拽缩放场景
Basic syntax of MySQL DDL and DML and DQL
华为设备配置BFD单跳检测二层链路
【RT_Thread学习笔记】---以太网LAN8720A Lwip ping 通网络
关于NOI 2022福建省选及省队组成的公告