Java通过JDBC查询MySQL的information_schema系统表(如TABLES、COLUMNS等)获取元数据,组装“库→表→字段”三级结构,再导出为Markdown/Excel/HTML格式;需配置allowPublicKeyRetrieval=true&useSSL=false,使用具备SELECT权限的普通账号即可。

Java 通过 JDBC 读取 information_schema 生成数据字典文档,核心是查询系统表(如 TABLES、COLUMNS、KEY_COLUMN_USAGE、REFERENTIAL_CONSTRAINTS 等),组装结构化信息,再导出为 Markdown、Excel 或 HTML 格式。
连接 MySQL 并查询 information_schema
确保 JDBC URL 启用 allowPublicKeyRetrieval=true&useSSL=false(MySQL 8.0+ 常需),并使用具备 SELECT 权限的账号(无需 DBA 权限,普通账号即可查 information_schema)。
示例连接与基础查询:
String url = "jdbc:mysql://localhost:3306/information_schema?allowPublicKeyRetrieval=true&useSSL=false";
String user = "your_user";
String pwd = "your_password";
<p>try (Connection conn = DriverManager.getConnection(url, user, pwd);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COMMENT " +
"FROM TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys') " +
"AND TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME")) {</p><pre class="brush:php;toolbar:false;">while (rs.next()) {
String schema = rs.getString("TABLE_SCHEMA");
String table = rs.getString("TABLE_NAME");
String comment = rs.getString("TABLE_COMMENT");
// 收集表级元数据
}}
获取字段详情与约束关系
单表字段信息需关联 COLUMNS、KEY_COLUMN_USAGE 和 REFERENTIAL_CONSTRAINTS 表,注意别名和 LEFT JOIN 避免漏字段。
-
COLUMNS提供字段名、类型、是否为空、默认值、注释 -
KEY_COLUMN_USAGE标识主键(CONSTRAINT_NAME='PRIMARY')、唯一键、外键列 -
REFERENTIAL_CONSTRAINTS+KEY_COLUMN_USAGE(两次 JOIN)可查外键引用关系(UPDATE_RULE / DELETE_RULE)
推荐一次性查出完整字段视图(含 PK/UK/FK 标记):
SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.ORDINAL_POSITION, c.COLUMN_DEFAULT, c.IS_NULLABLE, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, c.COLUMN_COMMENT, CASE WHEN k.CONSTRAINT_NAME = 'PRIMARY' THEN 'PRI' ELSE '' END AS COLUMN_KEY, k.CONSTRAINT_NAME AS CONSTRAINT_NAME, rc.UPDATE_RULE, rc.DELETE_RULE, rc.UNIQUE_CONSTRAINT_NAME, k.REFERENCED_TABLE_SCHEMA, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM COLUMNS c LEFT JOIN KEY_COLUMN_USAGE k ON c.TABLE_SCHEMA = k.TABLE_SCHEMA AND c.TABLE_NAME = k.TABLE_NAME AND c.COLUMN_NAME = k.COLUMN_NAME LEFT JOIN REFERENTIAL_CONSTRAINTS rc ON k.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND k.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA WHERE c.TABLE_SCHEMA = ? -- 动态传入库名 ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION
组装数据模型并生成文档
建议按“库 → 表 → 字段”三级结构建模,用 POJO 封装(如 DatabaseDoc、TableDoc、ColumnDoc),再统一渲染。
- Markdown:用 StringBuilder 拼接标题、表格(对齐用
|---|)、代码块;支持 GitHub 预览 - Excel:Apache POI 写入多 sheet(每个库一个 sheet,每张表一个 tab,或汇总到一张表)
- HTML:FreeMarker 或 Thymeleaf 模板渲染,加 CSS 实现折叠/搜索
关键细节:
- 字段类型映射:把
varchar(255)、datetime等转成业务易懂格式(如 “字符串(255)”、“日期时间”) - 注释优先级:字段
COLUMN_COMMENT> 表TABLE_COMMENT> 空字符串 - 外键标注:在字段描述后追加
[FK → db.table.col],避免歧义
封装为可复用工具类
抽离为独立模块(如 SchemaDocGenerator),支持配置:
- 白名单库名列表(排除测试库、日志库)
- 输出路径与格式(
--format=md --output=./docs) - 忽略字段(如
create_time,update_by等通用字段不显示注释) - HTTP 接口(Spring Boot Controller)供前端触发生成
运行时可加进度提示(查多少表、多少字段),失败时打印具体 SQL 和异常堆栈,便于排查权限或语法问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











