1. 程式人生 > 其它 >Java匯出Markdown格式的資料字典

Java匯出Markdown格式的資料字典

技術標籤:Javajava資料庫markdown

Java匯出Markdown格式的資料字典

引入依賴

pom.xml

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.27</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> <scope>runtime<
/scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <scope>provided</scope> </dependency>

資料庫連線配置

application.yml

# 資料庫配置
db:
  driver: com.mysql.
cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useSSL=true&verifyServerCertificate=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true username: root password: 123456 # 資料庫名 database: - test # 匯出配置 export: # 資料夾 dir: D:\symon

編碼實現

  • 獲取資料庫連線
protected Connection getConnection() throws ClassNotFoundException, SQLException {
    if (connection == null) {
        DatabaseConfig databaseConfig = config.getDb();
        Class.forName(databaseConfig.getDriver());
        connection = DriverManager.getConnection(databaseConfig.getUrl(), databaseConfig.getUsername(), databaseConfig.getPassword());
    }
    return connection;
}
  • 查詢資料的表資訊
protected List<Table> getTables(PreparedStatement ps) throws SQLException {
    List<Table> tables = new ArrayList<>();
    try (ResultSet tableResult = ps.executeQuery()) {
        while (tableResult.next()) {
            String tableName = tableResult.getString(1);
            String tableComment = StringUtils.nullToBlank(tableResult.getString(2));
            Table table = new Table();
            table.setTableName(tableName);
            table.setTableComment(StringUtils.replaceSep(tableComment));
            tables.add(table);
        }
    }
    return tables;
}

protected List<Column> getColumns(Connection connection, PreparedStatement ps, String database, String tableName) throws SQLException {
    List<Column> columns = new ArrayList<>();
    try (ResultSet resultSet = ps.executeQuery()) {

        List<String> primaryKeyColumnNames = getPrimaryKeyColumnNames(connection, database, tableName);
        String primaryKeyComment = getPrimaryKeyComment(primaryKeyColumnNames.size());

        while (resultSet.next()) {
            Column column = new Column();
            column.setOrdinal(resultSet.getInt(1));
            column.setName(resultSet.getString(2));
            column.setDataType(resultSet.getString(3));
            column.setAllowNull(resultSet.getString(4));
            column.setDefaultValue(StringUtils.nullToBlank(resultSet.getString(5)));
            String comment = StringUtils.nullToBlank(resultSet.getString(6));
            column.setComment(StringUtils.replaceSep(comment));
            if (primaryKeyColumnNames.contains(column.getName()) && !comment.contains(primaryKeyComment)) {
                comment = comment.length() != 0 ? primaryKeyComment + "," + comment : primaryKeyComment;
                column.setComment(comment);
            }
            columns.add(column);
        }
    }
    return columns;
}
  • 匯出實現程式碼
private File export(Connection connection, String database) throws IOException, SQLException {
    File markdownFile = getOutputFile(database);
    try (FileWriter fileWriter = new FileWriter(markdownFile, false)) {
        String title = String.format(PatternConstant.TITLE, database);
        fileWriter.write(title);
        writeLineSeparator(fileWriter, 2);

        String exportDate = String.format(PatternConstant.DATE, new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        fileWriter.write(exportDate);
        writeLineSeparator(fileWriter, 2);

        List<Table> tables;
        try (PreparedStatement ps = getTablePreparedStatement(connection, database)) {
            tables = getTables(ps);
        }

        try (PreparedStatement ps = getColumnPreparedStatement(connection, database)) {
            for (Table table : tables) {
                String tableName = table.getTableName();
                setColumnPreparedStatementParams(ps, tableName);
                List<Column> columns = getColumns(connection, ps, database, tableName);

                fileWriter.write(String.format(PatternConstant.CATALOG, tableName));
                writeLineSeparator(fileWriter, 1);
                fileWriter.write(String.format(PatternConstant.COMMENT, table.getTableComment()));
                writeLineSeparator(fileWriter, 2);
                fileWriter.write(PatternConstant.TABLE_HEADER);
                writeLineSeparator(fileWriter, 1);
                fileWriter.write(PatternConstant.TABLE_SEPARATOR);
                writeLineSeparator(fileWriter, 1);

                for (Column column : columns) {
                    fileWriter.write(String.format(PatternConstant.TABLE_BODY, getColumnValues(column)));
                    writeLineSeparator(fileWriter, 1);
                }

                writeLineSeparator(fileWriter, 2);
            }
        }
    }
    return markdownFile;
}

詳細程式碼見:https://gitee.com/ssymon/export-to-md

這裡只實現了MySQL的方式,其他資料自行實現AbstractDatabaseExporter就行了