关于java:Java如何用-JDBC-写一个数据库文档生成工具

23次阅读

共计 3649 个字符,预计需要花费 10 分钟才能阅读完成。

前言
在工作中常常会遇到须要交付数据库文档的场景,而编写这样的文档又是一个很干燥、反复的事件,齐全能够通过自动化的形式来实现这样的工作。

本文提供了一个在 JAVA 中如何基于 JDBC 来实现生成数据库文档的思路,心愿对你有所帮忙。

第一步:可行性?
JDBC 是 Java Database Connectivity 的缩写,从名字就能看进去是 Java 定义的连贯数据库的一个规范,这个规范的具体体现就是一系列接口
java.sql.Connection
java.sql.DatabaseMetaData
java.sql.Driver
java.sql.Statement
javax.sql.DataSource

其中 java.sql.DatabaseMetaData(以下简称 DatabaseMetaData)接口就是对数据库元信息的形象,这里的元信息就蕴含了 schema、table、index、column 等咱们熟知的概念。

通过 IDEA 咱们能够很轻松的查看 DatabaseMetaData 接口定义的办法列表,比方

getTables:获取表信息
getColumns:获取列信息
getIndexInfo:获取索引信息
getPrimaryKeys:获取主键信息


由此可见,基于 JDBC 来生成数据库文档的可行性是没问题的,那么接下来咱们就进入试验阶段。

第二步:Demo
试验环境:

Mysql
Java
Mysql 数据筹备

CREATE DATABASE IF NOT EXISTS demo;

CREATE TABLE demo.user
(
    id        INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
    username  VARCHAR(255)                   NOT NULL,
    nickname  VARCHAR(255)                   NOT NULL DEFAULT '',
    create_at TIMESTAMP                               DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT uk_user_username UNIQUE (username)
) CHARSET utf8mb4
  COLLATE utf8mb4_unicode_ci COMMENT '用户';

CREATE TABLE demo.post
(
    id        INT PRIMARY KEY AUTO_INCREMENT      NOT NULL,
    user_id   INT                                 NOT NULL,
    title     VARCHAR(255)                        NOT NULL,
    content   TEXT                                NOT NULL,
    create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
) CHARSET utf8mb4
  COLLATE utf8mb4_unicode_ci COMMENT '文章';

试验指标:

获取 demo 库中的 user、post 表数据
试验流程:

首先咱们须要通过 java.sql.Connection(以下简称 Connection)的 getMetaData 办法来获取上一节提到的 DatabaseMetaData 类。

public interface Connection  extends Wrapper, AutoCloseable {DatabaseMetaData getMetaData() throws SQLException;
}

Connection 的获取须要依赖数据库驱动,以 Mysql 为例,就得通过通过构建工具引入 mysql-connector-java 这个库。

上面的代码展现了在 Gradle 中引入的形式

dependencies {implementation "mysql:mysql-connector-java:8.0.27"}

依赖刷新实现当前就能够创立 Connection 并获取 DatabaseMetaData 对象了:

class Demo {public static void main(String[] args) throws SQLException {DatabaseMetaData metaData = getMetaData(); // 胜利获取 metaData 对象
    }

    public static DatabaseMetaData getMetaData() throws SQLException {
        try {
            // 加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {throw new IllegalStateException(e);
        }

        Properties info = new Properties();
        // 填入你的用户名、明码和连贯地址
        info.put("user", "root");
        info.put("password", "123456");
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/demo";
        Connection connection = DriverManager.getConnection(jdbcUrl, info);
        return connection.getMetaData();}
}

后面咱们曾经简略展现过 DatabaseMetaData 的 API 了,其中 getTables 就是获取所有表的办法,残缺查看一下该办法的定义

ResultSet getTables(String catalog,
                    String schemaPattern,
                    String tableNamePattern,
                    String types[]) throws SQLException;

在源码中有残缺的正文,限于篇幅我就不贴了,间接阐明一下这些参数

catalog:catalog 名称,能够为 null
schemaPattern:schema 名称含糊查问,能够为 null
tableNamePattern:表名含糊查问,表名称,能够为 null
types:类型,比方 VIEW、TABLE 等,能够为 null
在 Mysql 中,catalog 和 schema 的其实是一样的,都代表着 database 的名称。

该办法返回的 ResultSet 在取值也须要遵循 JDBC 的标准,一个 ResultSet 代表返回的一行数据,其中咱们关注的列定义如下(残缺定义能够查看该办法的源码正文)

列名称 阐明
TABLE_CAT 表所属的 catalog
TABLE_SCHEM 表所属的 schema
TABLE_NAME 表名称
TABLE_TYPE 表类型,如 TABLE、VIEWSYSTEM TABLE 等
REMARKS 备注,即通过 comment 语句指定的阐明

办法的参数和返回值都确认当前咱们就能够持续欠缺后面的 main 办法了:

class Demo {public static void main(String[] args) throws SQLException {DatabaseMetaData metaData = getMetaData();
        // 获取 demo 库下所有表
        ResultSet result = metaData.getTables("demo", null, null, null);
        while (result.next()) {
            String msg = String.format("Table:%s, Type: %s, Comment: %s",
                    result.getString("TABLE_NAME"),
                    result.getString("TABLE_TYPE"),
                    result.getString("REMARKS"));
            System.out.println(msg);
        }
    }
    
    // 疏忽 getMetaData() 办法}

不出意外控制台就会打印以下信息

Table:post, Type: TABLE, Comment: 文章
Table:user, Type: TABLE, Comment: 用户

第三步:欠缺
获取到表的信息当前,还须要依据表名去获取对应的列、索引、外键、主键等内容,失去这些数据当前就能生成一份残缺的数据库文档了。

这些内容的获取在 DatabaeMetaData 中都有对应的办法

ResultSet getColumns(catalog, schemaPattern, tableNamePattern, columnNamePattern)
ResultSet getIndexInfo(catalog, schema, table, unique, approximate)
ResultSet getPrimaryKeys(catalog, schema,table)
ResultSet getImportedKeys(catalog, schema, table)
办法的调用和取值整体思路与第二步中的代码基本一致,如果你还是没有思路的话,能够在这里查看我曾经实现了的代码:

https://github.com/vran-dev/d…
除此之外,基于这个思路我还将其欠缺成了一个产品 Databasir,它是一个在线的数据库文档治理平台,或者你能够间接应用:

以上就是所有内容,心愿能帮忙到大家!

正文完
 0