前言
在企业级开发中,我们经常会有编写数据库文档的时间付出,关于数据库文档的状态:要么没有、要么有但都是手写、后期运维开发都需要手动对文档进行维护,很是繁琐。如果忘记一次维护就会给以后的工作造成很多困扰,这无形中留了很多坑给自己和后人。screw 是一款简洁好用的数据库文档生成工具,专为解决这一开发痛点而生。
screw 介绍
特色功能
- 灵活扩展
- 支持自定义模板
- 支持多种数据库
- 支持多种格式的文档
- 简洁、轻量、设计良好
数据库支持
文档类型支持
screw 使用
基于 Java 代码
第一种使用方式是基于 Java 代码,自动生成数据库文档。
Maven 依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <dependencies> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> <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.20</version> </dependency> </dependencies>
|
Java 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| 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;
public class ScrewTest {
public static final String fileOutputDir = "D:/database/docs";
public static void main(String[] args) { documentGeneration(); }
public static void documentGeneration() { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/database"); hikariConfig.setUsername("root"); hikariConfig.setPassword("123456"); hikariConfig.addDataSourceProperty("useInformationSchema", "true"); hikariConfig.setMinimumIdle(2); hikariConfig.setMaximumPoolSize(5); DataSource dataSource = new HikariDataSource(hikariConfig); EngineConfig engineConfig = EngineConfig.builder() .fileOutputDir(fileOutputDir) .openOutputDir(true) .fileType(EngineFileType.HTML) .produceType(EngineTemplateType.freemarker) .fileName("自定义文件名称").build();
ArrayList<String> ignoreTableName = new ArrayList<>(); ArrayList<String> ignorePrefix = new ArrayList<>(); ArrayList<String> ignoreSuffix = new ArrayList<>(); ProcessConfig processConfig = ProcessConfig.builder() .designatedTableName(new ArrayList<>()) .designatedTablePrefix(new ArrayList<>()) .designatedTableSuffix(new ArrayList<>()) .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(); } }
|
基于 Maven 插件
第二种使用方式是基于 Maven 插件,自动生成数据库文档。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| <build> <plugins> <plugin> <groupId>cn.smallbun.screw</groupId> <artifactId>screw-maven-plugin</artifactId> <version>${lastVersion}</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.20</version> </dependency> </dependencies> <configuration> <username>root</username> <password>123456</password> <driverClassName>com.mysql.cj.jdbc.Driver</driverClassName> <jdbcUrl>jdbc:mysql://127.0.0.1:3306/database</jdbcUrl> <fileType>HTML</fileType> <openOutputDir>false</openOutputDir> <produceType>freemarker</produceType> <fileName>测试文档名称</fileName> <description>数据库文档生成</description> <version>${project.version}</version> <title>数据库文档</title> </configuration> <executions> <execution> <phase>compile</phase> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
|
扩展模块
在日常的开发中,经过需求分析、建模之后,往往会先在数据库中建表,其次再进行代码的开发。使用 POJO 生成功能可以直接根据数据库表生成对应的 Java POJO 对象,这可以帮助开发人员节省一些重复劳动。screw 支持 POJO 生成功能,目前处于初步开发的状态,且仅支持 MySQL 数据库。
POJO 生成模块
1 2 3 4 5
| <dependency> <groupId>cn.smallbun.screw</groupId> <artifactId>screw-extension</artifactId> <version>${lastVersion}</version> </dependency>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
void pojoGeneration() { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/database"); hikariConfig.setUsername("root"); hikariConfig.setPassword("123456"); hikariConfig.addDataSourceProperty("useInformationSchema", "true"); hikariConfig.setMinimumIdle(2); hikariConfig.setMaximumPoolSize(5); DataSource dataSource = new HikariDataSource(hikariConfig);
ProcessConfig processConfig = ProcessConfig.builder() .designatedTableName(new ArrayList<>()) .designatedTablePrefix(new ArrayList<>()) .designatedTableSuffix(new ArrayList<>()).build();
PojoConfiguration config = new PojoConfiguration(); config.setPath("/cn/smallbun/screw/"); config.setPackageName("cn.smallbun.screw"); config.setUseLombok(false); config.setDataSource(dataSource); config.setNameStrategy(new HumpNameStrategy()); config.setProcessConfig(processConfig); new PojoExecute(config).execute(); }
|
常见问题
在连接 MySQL 的 URL 中加入 characterEncoding=UTF-8
即可
问题二
MySQL 数据库表和列字段有注释,但生成的数据库文档却没有注释?
在连接 MySQL 的 URL 中加入 useInformationSchema=true
即可
问题三
运行抛出异常: Caused by: java.lang.NoSuchFieldError: VERSION_2_3_30
检查项目中 freemarker
的依赖版本,这是由于版本过低造成的,升级版本为 2.3.30
即可
问题四
运行抛出异常: java.lang.AbstractMethodError: com.mysql.jdbc.JDBC4Connection.getSchema()Ljava/lang/String;
这是因为 MySQL 驱动的版本过低造成的,升级 MySQL 驱动的版本为最新即可
问题五
运行抛出异常: java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.getSchema()Ljava/lang/String;
这是因为 Oracle 驱动版本过低造成的,删除或屏蔽当前的驱动版本,并将驱动升级为以下版本:
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>com.oracle.ojdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> <dependency> <groupId>cn.easyproject</groupId> <artifactId>orai18n</artifactId> <version>12.1.0.2.0</version> </dependency>
|
文档生成截图