From 5777eab25d06a1be680a406d5a6d6d5784863efc Mon Sep 17 00:00:00 2001 From: vran Date: Tue, 28 Dec 2021 21:10:08 +0800 Subject: [PATCH] feat: update README --- README.md | 92 +++++++++++++----- README/table-doc.png | Bin 0 -> 54241 bytes .../core/doc/factory/DatabaseDocConfig.java | 3 - core/src/test/java/App.java | 4 +- 4 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 README/table-doc.png diff --git a/README.md b/README.md index 1e1d8c2..d1f2301 100644 --- a/README.md +++ b/README.md @@ -2,36 +2,78 @@ Database document generator -# Features +you could use `databasir` to generate database meta model, or render it as markdown / pdf (TODO) / html (TODO) -- render as markdown -- render as html (TODO) -- render as PDF (TODO) +# How to use -# Quick Start +## Database Meta to Java Model ```java -// First: get database connection -Class.forName("com.mysql.cj.jdbc.Driver"); -Properties info=new Properties(); -info.put("user","root"); -info.put("password","123456"); -// this config is used by mysql -info.put("useInformationSchema","true"); -String url="jdbc:mysql://localhost:3306/patient?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true"; -var connection=DriverManager.getConnection(url,info); - -// Second: generate doc model -var config=DatabaseDocConfiguration.builder() - .databaseName("patient") - .connection(connection) - .build(); +java.sql.Connection connection = ...; +DatabaseDocConfig config = DatabaseDocConfig.builder() + .databaseName("Demo") + .connection(connection) + .build(); DatabaseDoc doc = JdbcDatabaseDocFactory.of().create(config).orElseThrow(); +``` -// Final: Render as markdown -try(FileOutputStream out=new FileOutputStream("doc.md")){ - MarkdownRender.of(new RenderConfiguration()).rendering(doc,out); -}catch(IOException e){ +## Render as Markdown +```java +java.sql.Connection connection = ...; +DatabaseDocConfig config = DatabaseDocConfig.builder() + .databaseName("Demo") + .connection(connection) + .build(); +DatabaseDoc doc = JdbcDatabaseDocFactory.of().create(config).orElseThrow(); +try (FileOutputStream out = new FileOutputStream("doc.md")) { + RenderConfig renderConfig = new RenderConfig(); + Render.markdownRender(renderConfig).rendering(doc, out); +} catch (IOException e) { throw new IllegalStateException(e); } -``` \ No newline at end of file +``` + +- Example + +![](README/table-doc.png) + + +## Ignore tables or columns + +support regex pattern to ignore table or column + +```java +java.sql.Connection connection = ...; +DatabaseDocConfig config = DatabaseDocConfig.builder() + .databaseName("Demo") + .connection(connection) + .ignoreTableRegexes(Arrays.asList("mysql_*")) + .ignoreColumnRegexes(Arrays.asList("id")) + .build(); +DatabaseDoc doc = JdbcDatabaseDocFactory.of().create(config).orElseThrow(); +``` + +## Extension + +Default factory + +- tableDocFactory -> `com.databasir.core.doc.factory.jdbc.JdbcTableDocFactory` +- columnDocFactory -> `com.databasir.core.doc.factory.jdbc.JdbcTableColumnDocFactory` +- indexDocFactory -> `com.databasir.core.doc.factory.jdbc.JdbcTableIndexDocFactory` +- triggerDocFactory -> `com.databasir.core.doc.factory.jdbc.JdbcTableTriggerDocFactory` + +Custom configuration +```java +java.sql.Connection connection = ...; +DatabaseDocConfig config = DatabaseDocConfig.builder() + .databaseName("Demo") + .connection(connection) + .tableDocFactory(...) // your custom table doc factory + .tableColumnDocFactory(...) // your custom column doc factory + .tableIndexDocFactory(...) // your custom index doc factory + .tableTriggerDocFactory(...) // your custom trigger doc factory + .build(); +DatabaseDoc doc = JdbcDatabaseDocFactory.of().create(config).orElseThrow(); +``` + + diff --git a/README/table-doc.png b/README/table-doc.png new file mode 100644 index 0000000000000000000000000000000000000000..4631cbf4f2eb378ead40d0ca11c83b890bc7eafa GIT binary patch literal 54241 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 literal 0 HcmV?d00001 diff --git a/core/src/main/java/com/databasir/core/doc/factory/DatabaseDocConfig.java b/core/src/main/java/com/databasir/core/doc/factory/DatabaseDocConfig.java index 63559d0..3afb89f 100644 --- a/core/src/main/java/com/databasir/core/doc/factory/DatabaseDocConfig.java +++ b/core/src/main/java/com/databasir/core/doc/factory/DatabaseDocConfig.java @@ -26,9 +26,6 @@ public class DatabaseDocConfig { @Builder.Default private List ignoreColumnRegexes = Collections.emptyList(); - @Builder.Default - private DatabaseDocFactory databaseDocFactory = new JdbcDatabaseDocFactory(); - @Builder.Default private TableDocFactory tableDocFactory = new JdbcTableDocFactory(); diff --git a/core/src/test/java/App.java b/core/src/test/java/App.java index f40f188..7d6b01d 100644 --- a/core/src/test/java/App.java +++ b/core/src/test/java/App.java @@ -25,14 +25,14 @@ public class App { // generate doc model var config = DatabaseDocConfig.builder() - .databaseName("patient") + .databaseName("user") .connection(connection) .tableTriggerDocFactory(new MysqlTableTriggerDocFactory()) .build(); DatabaseDoc doc = JdbcDatabaseDocFactory.of().create(config).orElseThrow(); // render as markdown - try (FileOutputStream out = new FileOutputStream("doc.md")) { + try (FileOutputStream out = new FileOutputStream("user.md")) { RenderConfig renderConfig = new RenderConfig(); renderConfig.setRenderTriggers(true); Render.markdownRender(renderConfig).rendering(doc, out);