枯燥的任务
这一切都要从多年前说起。
那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表。
因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表。
如果是你,你会怎么处理这个任务呢?
一开始我是直接准备人工把所有的字段整理一遍,然后整理出对应的 SQL 插入到元数据库管理表中。
meta_table 元数据表信息
meta_field 元数据字段信息
一开始还有点激情,后来就是无尽的重复,感觉十分无聊。
于是,我自己动手写了一个开源的小工具。
https://github.com/houbb/metadata
元数据管理
metadata 可以自动将所有的表信息和字段信息存入元数据表中,便于统一查阅。
(注释需要保证库本身已经包含了对于表和字段的注释)
一开始实现了 3 种常见的数据库:mysql oracle sql-server。
以 mysql 为例,对应的建表语句为:
metadata 是一个 web 应用,部署启动后,页面指定数据库连接信息,就可以完成所有数据的初始化。

以测试脚本
为例,可以将对应的表和字段信息全部初始化到对应的表中。
一切看起来都很棒,几分钟就搞定了。不是吗?
代码自动生成
本来 metadata 没有意外的话,我几乎不会再去修改他了。
直接前不久,我基于 mybatis-plus-generator 实现了一个代码自动生成的低代码平台。
开源地址如下:
http://github.com/houbb/low-code
我发现了 metadata 这个应用虽然作为 web 应用还不错,但是本身的复用性很差,我无法在这个基础上实现一个代码生成工具。
于是,就诞生了实现一个最基础的 jdbc 元数据管理工具的想法。
他山之石,可以攻玉。
我们就直接以 MPG 的源码为例,学习并且改造。
数据库元数据
元数据管理最核心的一点在于所有的数据库本身就有元数据管理。
我们以 mysql 为例,查看所有表信息。
如下:
对应的字段信息查看
输出如下:
可以获取到非常全面的信息,代码生成就是基于这些基本信息,生成对应的代码文本。
其中,word 的建表语句如下:
虽然上面介绍元数据获取,是以 mysql 为例。
但是我们在实现工具的时候,一定要考虑对应的可拓展性。
可以是 mysql,也可以是常见的 oracle/sql-server。
每一种数据库的获取方式都是不同的,所以需要根据配置不同,实现也要不同。
获取到元数据之后,处理的方式也可以非常多样化。
可以控台输出,可以入库,可以生成对应的 markdown/html/pdf/word/excel 不同形式的文档等。
好的工具,应该对用户屏蔽复杂的实现细节。
用户只需要简单的指定配置信息,想要获取的表,处理方式即可。
至于如何实现,用户可以不关心。
源码实现
接下来,我们结合 MPG 的源码,抽取最核心的部分进行讲解。
如何根据连接信息获取 connection?
希望经常使用 mybatis 等工具的你还记得:
IDbConnection 接口的定义非常简单:
这样便于后期替换实现,你甚至可以使用数据库连接池:
https://github.com/houbb/jdbc-pool
对于不同的数据库,查询的方式不同。
以 mysql 为例,实现如下:
其中 <code>show table status</code> 用于查看所有的表元数据;<code>show full fields from %s</code> 可以查看具体表的字段元数据。
nullable() 和 defaultValue() 这两个属性是老马新增的,MPG 中是没有的,因为代码生成不关心这两个字段。
做好上面的准备工作之后,我们可以开始进行核心代码编写。
具体数据库的实现是不同的,可以根据 driverName 获取。
DbTypeUtils 的实现如下:
根据对应的 IDbQuery 构建表数据查询的 sql。
直接获取对应的 tablesSql 即可,非常简答。
直接根据构建好的 tableSql 查询,然后构建最基本的表信息。
此处省去对表信息的过滤。
表信息构建为完成后,构建具体的字段信息。
字段信息的实现也比较简单,直接根据对应的 sql 进行查询,然后构建即可。
在经过大量的删减之后,我们可以获取最基础的表元数据信息。
但是要怎么处理这个列表信息呢?
我们可以定义一个接口:
context 的属性比较简单,目前就是 <code>List<TableInfo></code>。
我们可以实现一个控台输出:
在控台输出对应的 markdown 字段信息。
你也可以实现自己的 html/pdf/word/excel 等等。
测试验证
我们前面写了这么多主要是原理实现。
那么工具是否好用,还是要体验一下。
指定输出 test.word 的表信息。
对应的日志如下:
这个就是简单的 markdown 格式,实际效果如下:
word 敏感词表
<col>
序列
列名
类型
是否为空
缺省值
描述
1
id
int(10) unsigned
NO
null
应用自增主键
2
word
varchar(128)
单词
3
type
varchar(8)
4
status
char(1)
S
状态
5
remark
varchar(64)
配置描述
6
operator_id
system
操作员名称
7
create_time
timestamp
CURRENT_TIMESTAMP
创建时间戳
8
update_time
更新时间戳
这样,我们就拥有了一个最简单的 jdbc 元数据管理工具。
当然,这个只是 v1.0.0 版本,后续还有许多特性需要添加。
小结
MPG 基本上每一个使用 mybatis 必备的工具,大大提升了我们的效率。
知道对应的实现原理,可以让我们更好的使用它,并且在其基础上,实现自己的脑洞。
我是老马,期待与你的下次重逢。
备注:涉及的代码较多,文中做了简化。若你对源码感兴趣,可以關註{老马啸西风},後臺回復{代码生成}即可获得。