一個數(shù)據(jù)庫文檔生成神器
gitee地址:https://gitee.com/leshalv/screw
Gitee項(xiàng)目地址,可以直接去開源項(xiàng)目查看
簡介
在企業(yè)級開發(fā)中、我們經(jīng)常會有編寫數(shù)據(jù)庫表結(jié)構(gòu)文檔的時間付出,從業(yè)以來,待過幾家企業(yè),關(guān)于數(shù)據(jù)庫表結(jié)構(gòu)文檔狀態(tài):要么沒有、要么有、但都是手寫、后期運(yùn)維開發(fā),需要手動進(jìn)行維護(hù)到文檔中,很是繁瑣、如果忘記一次維護(hù)、就會給以后工作造成很多困擾、無形中制造了很多坑留給自己和后人。
于是萌生了要自己寫一個插件工具的想法,但由于自己前期在程序設(shè)計(jì)上沒有很多造詣,且能力偏低,有想法并不能很好實(shí)現(xiàn),隨著工作閱歷的增加,和知識的不斷儲備,終于在2020年的3月中旬開始進(jìn)行編寫。
4月上旬完成初版,想完善差不多在開源,但由于工作太忙,業(yè)余時間不足,沒有在進(jìn)行完善,到了6月份由于工作原因、頻繁設(shè)計(jì)和更改數(shù)據(jù)庫、經(jīng)常使用自己寫的此插件、節(jié)省了很多時間,解決了很多問題 ,在僅有且不多的業(yè)余時間中、進(jìn)行開源準(zhǔn)備,于2020年6月22日,開源,歡迎大家使用、建議、并貢獻(xiàn)。
關(guān)于名字,想一個太難了,好在我這個聰明的小腦瓜靈感一現(xiàn),怎么突出它的小,但重要呢?從小就學(xué)過雷鋒的螺絲釘精神,摘自雷鋒日記:雖然是細(xì)小的螺絲釘,是個細(xì)微的小齒輪,然而如果缺了它,那整個的機(jī)器就無法運(yùn)轉(zhuǎn)了,慢說是缺了它,即使是一枚小螺絲釘沒擰緊,一個小齒輪略有破損,也要使機(jī)器的運(yùn)轉(zhuǎn)發(fā)生故障的...,感覺自己寫的這個工具,很有這意味,雖然很小、但是開發(fā)中缺了它還不行,于是便起名為screw(螺絲釘)。
特點(diǎn)
簡潔、輕量、設(shè)計(jì)良好
多數(shù)據(jù)庫支持
多種格式文檔
靈活擴(kuò)展
支持自定義模板
數(shù)據(jù)庫支持
MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB(2016) H2 (開發(fā)中) DB2 ?(開發(fā)中) HSQL ?(開發(fā)中) SQLite(開發(fā)中) 瀚高(開發(fā)中) 達(dá)夢 (開發(fā)中) 虛谷 ?(開發(fā)中) 人大金倉(開發(fā)中)
文檔生成支持
html word markdown
文檔截圖
html


word

markdwon


使用方式
普通方式
引入依賴
<dependency>
????<groupId>cn.smallbun.screwgroupId>
????<artifactId>screw-coreartifactId>
????<version>${lastVersion}version>
?dependency>
編寫代碼
/**
?*?文檔生成
?*/
void?documentGeneration()?{
???//數(shù)據(jù)源
???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("password");
???//設(shè)置可以獲取tables?remarks信息
???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)
?????????//生成模板實(shí)現(xiàn)
?????????.produceType(EngineTemplateType.freemarker)
?????????//自定義文件名稱
?????????.fileName("自定義文件名稱").build();
???//忽略表
???ArrayList?ignoreTableName?=?new?ArrayList<>();
???ignoreTableName.add("test_user");
???ignoreTableName.add("test_group");
???//忽略表前綴
???ArrayList?ignorePrefix?=?new?ArrayList<>();
???ignorePrefix.add("test_");
???//忽略表后綴????
???ArrayList?ignoreSuffix?=?new?ArrayList<>();
???ignoreSuffix.add("_test");
???ProcessConfig?processConfig?=?ProcessConfig.builder()
?????????//指定生成邏輯、當(dāng)存在指定表、指定表前綴、指定表后綴時,將生成指定表,其余表不生成、并跳過忽略表配置?
???//根據(jù)名稱指定表生成
???.designatedTableName(new?ArrayList<>())
???//根據(jù)表前綴生成
???.designatedTablePrefix(new?ArrayList<>())
???//根據(jù)表后綴生成?
???.designatedTableSuffix(new?ArrayList<>())
?????????//忽略表名
?????????.ignoreTableName(ignoreTableName)
?????????//忽略表前綴
?????????.ignoreTablePrefix(ignorePrefix)
?????????//忽略表后綴
?????????.ignoreTableSuffix(ignoreSuffix).build();
???//配置
???Configuration?config?=?Configuration.builder()
?????????//版本
?????????.version("1.0.0")
?????????//描述
?????????.description("數(shù)據(jù)庫設(shè)計(jì)文檔生成")
?????????//數(shù)據(jù)源
?????????.dataSource(dataSource)
?????????//生成配置
?????????.engineConfig(engineConfig)
?????????//生成配置
?????????.produceConfig(processConfig)
?????????.build();
???//執(zhí)行生成
???new?DocumentationExecute(config).execute();
}
Maven 插件
<build>
????<plugins>
????????<plugin>
????????????<groupId>cn.smallbun.screwgroupId>
????????????<artifactId>screw-maven-pluginartifactId>
????????????<version>${lastVersion}version>
????????????<dependencies>
????????????????
????????????????<dependency>
????????????????????<groupId>com.zaxxergroupId>
????????????????????<artifactId>HikariCPartifactId>
????????????????????<version>3.4.5version>
????????????????dependency>
????????????????
????????????????<dependency>
????????????????????<groupId>mysqlgroupId>
????????????????????<artifactId>mysql-connector-javaartifactId>
????????????????????<version>8.0.20version>
????????????????dependency>
????????????dependencies>
????????????<configuration>
????????????????
????????????????<username>rootusername>
????????????????
????????????????<password>passwordpassword>
????????????????
????????????????<driverClassName>com.mysql.cj.jdbc.DriverdriverClassName>
????????????????
????????????????<jdbcUrl>jdbc:mysql://127.0.0.1:3306/xxxxjdbcUrl>
????????????????
????????????????<fileType>HTMLfileType>
????????????????
????????????????<openOutputDir>falseopenOutputDir>
????????????????
????????????????<produceType>freemarkerproduceType>
????????????????
????????????????<fileName>測試文檔名稱fileName>
????????????????
????????????????<description>數(shù)據(jù)庫文檔生成description>
????????????????
????????????????<version>${project.version}version>
????????????????
????????????????<title>數(shù)據(jù)庫文檔title>
????????????configuration>
????????????<executions>
????????????????<execution>
????????????????????<phase>compilephase>
????????????????????<goals>
????????????????????????<goal>rungoal>
????????????????????goals>
????????????????execution>
????????????executions>
????????plugin>
????plugins>
build>
擴(kuò)展模塊
pojo生成功能
功能簡介
pojo生成功能是基于screw延伸出的擴(kuò)展模塊,目前處于初步開發(fā)的狀態(tài)。在日常的開發(fā)中,經(jīng)過需求分析、建模之后,往往會先在數(shù)據(jù)庫中建表,其次在進(jìn)行代碼的開發(fā)。那么pojo生成功能在這個階段就可以幫助大家節(jié)省一些重復(fù)勞動了。
使用pojo生成功能可以直接根據(jù)數(shù)據(jù)庫生成對應(yīng)的java pojo對象。這樣后續(xù)的修改,開發(fā)都會很方便。
數(shù)據(jù)庫支持
MySQL
使用方式
引入依賴
<dependency>
????<groupId>cn.smallbun.screwgroupId>
????<artifactId>screw-extensionartifactId>
????<version>${lastVersion}version>
?dependency>
編寫代碼
/**
?*?pojo生成
?*/
void?pojoGeneration()?{
????//數(shù)據(jù)源
????HikariConfig?hikariConfig?=?new?HikariConfig();
????hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
????hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/screw");
????hikariConfig.setUsername("screw");
????hikariConfig.setPassword("screw");
????//設(shè)置可以獲取tables?remarks信息
????hikariConfig.addDataSourceProperty("useInformationSchema",?"true");
????hikariConfig.setMinimumIdle(2);
????hikariConfig.setMaximumPoolSize(5);
????DataSource?dataSource?=?new?HikariDataSource(hikariConfig);
????ProcessConfig?processConfig?=?ProcessConfig.builder()
????????//指定生成邏輯、當(dāng)存在指定表、指定表前綴、指定表后綴時,將生成指定表,其余表不生成、并跳過忽略表配置
????????//根據(jù)名稱指定表生成
????????.designatedTableName(new?ArrayList<>())
????????//根據(jù)表前綴生成
????????.designatedTablePrefix(new?ArrayList<>())
????????//根據(jù)表后綴生成
????????.designatedTableSuffix(new?ArrayList<>()).build();
????//設(shè)置生成pojo相關(guān)配置
????PojoConfiguration?config?=?new?PojoConfiguration();
????//設(shè)置文件存放路徑
????config.setPath("/cn/smallbun/screw/");
????//設(shè)置包名
????config.setPackageName("cn.smallbun.screw");
????//設(shè)置是否使用lombok
????config.setUseLombok(false);
????//設(shè)置數(shù)據(jù)源
????config.setDataSource(dataSource);
????//設(shè)置命名策略
????config.setNameStrategy(new?HumpNameStrategy());
????//設(shè)置表過濾邏輯
????config.setProcessConfig(processConfig);
????//執(zhí)行生成
????new?PojoExecute(config).execute();
}
常見問題
生成后文檔亂碼?
MySQL:URL加入
?characterEncoding=UTF-8。Caused by: java.lang.NoSuchFieldError: VERSION_2_3_30?
檢查項(xiàng)目
freemarker依賴,這是由于版本過低造成的,升級版本為2.3.30即可。java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.getSchema()Ljava/lang/String;
這是因?yàn)閛racle驅(qū)動版本過低造成的,刪除或屏蔽目前驅(qū)動版本,驅(qū)動添加升級為以下版本:
????<dependency>
???????<groupId>com.oracle.ojdbcgroupId>
???????<artifactId>ojdbc8artifactId>
???????<version>19.3.0.0version>
????dependency>
????<dependency>
???????<groupId>cn.easyprojectgroupId>
???????<artifactId>orai18nartifactId>
???????<version>12.1.0.2.0version>
????dependency>
MySQL數(shù)據(jù)庫表和列字段有說明、生成文檔沒有說明?
URL鏈接加入
useInformationSchema=true即可。java.lang.AbstractMethodError: com.mysql.jdbc.JDBC4Connection.getSchema()Ljava/lang/String;
這是因?yàn)閙ysql驅(qū)動版本過低造成的,升級mysql驅(qū)動版本為最新即可
最近熬夜給大家準(zhǔn)備了515套Java代碼,有一些是業(yè)務(wù)類的小項(xiàng)目,比如Java博客項(xiàng)目,也有腳手架、也有平時用一些的工具類、21套小程序代碼,也有一些游戲類的項(xiàng)目。
掃以下二維碼并回復(fù)“828”即可獲取
或者在本公眾號對話框回復(fù)【828】馬上獲取

