天天看点

从代码生成说起,带你深入理解 mybatis generator 源码

枯燥的任务

这一切都要从多年前说起。

那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表。

因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表。

如果是你,你会怎么处理这个任务呢?

一开始我是直接准备人工把所有的字段整理一遍,然后整理出对应的 SQL 插入到元数据库管理表中。

meta_table 元数据表信息

meta_field 元数据字段信息

一开始还有点激情,后来就是无尽的重复,感觉十分无聊。

于是,我自己动手写了一个开源的小工具。

​​https://github.com/houbb/metadata​​

元数据管理

metadata 可以自动将所有的表信息和字段信息存入元数据表中,便于统一查阅。

(注释需要保证库本身已经包含了对于表和字段的注释)

一开始实现了 3 种常见的数据库:mysql oracle sql-server。

以 mysql 为例,对应的建表语句为:

metadata 是一个 web 应用,部署启动后,页面指定数据库连接信息,就可以完成所有数据的初始化。

从代码生成说起,带你深入理解 mybatis generator 源码

以测试脚本

为例,可以将对应的表和字段信息全部初始化到对应的表中。

一切看起来都很棒,几分钟就搞定了。不是吗?

代码自动生成

本来 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&lt;TableInfo&gt;​</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 必备的工具,大大提升了我们的效率。

知道对应的实现原理,可以让我们更好的使用它,并且在其基础上,实现自己的脑洞。

我是老马,期待与你的下次重逢。

备注:涉及的代码较多,文中做了简化。若你对源码感兴趣,可以關註{老马啸西风},後臺回復{代码生成}即可获得。

上一篇: DAX函数大全
下一篇: 线性表基础