枯燥的任務
這一切都要從多年前說起。
那時候剛入職一家新公司,項目經理給我配置設定了一個比較簡單的工作,為所有的資料庫字段整理一張中繼資料表。
因為很多接手的項目文檔都不全,是以需要統一整理一份基本的字典表。
如果是你,你會怎麼處理這個任務呢?
一開始我是直接準備人工把所有的字段整理一遍,然後整理出對應的 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 必備的工具,大大提升了我們的效率。
知道對應的實作原理,可以讓我們更好的使用它,并且在其基礎上,實作自己的腦洞。
我是老馬,期待與你的下次重逢。
備注:涉及的代碼較多,文中做了簡化。若你對源碼感興趣,可以關註{老馬嘯西風},後臺回復{代碼生成}即可獲得。