簡介
MybatisPlus最新代碼生成器(3.5.1+)使用教程(1)——輸出路徑詳細解析
MybatisPlus最新代碼生成器(3.5.1+)使用教程(2)——輸出文件名詳細解析
MybatisPlus最新代碼生成器(3.5.1+)使用教程(3)——指定數據庫表詳細解析
MybatisPlus最新代碼生成器(3.5.1+)使用教程(4)——文件模板解析
前兩篇教程說明了如何通過 packageConfig 控制輸出路徑,以及通過 strategyConfig 控制輸出文件名,本文將着重說明如何指定數據庫表。
com.baomidou.mybatisplus.generator.IDatabaseQuery 是一個抽象類。它的實現類,同時也是它的內部靜態類 DefaultDatabaseQuery,重點分析它的 queryTables 方法。
因為該方法就是掃描數據庫表,並獲取所需表信息的類。
先來看一下 addInclude 的使用方法展示:
FastAutoGenerator.create("url", "username", "password")
// addInclude 增加包含的表名,可以增加多個
.strategyConfig(builder -> builder.addInclude("ums_administrator"))
.execute();
接着,再來看 addExclude 的使用方法展示:
FastAutoGenerator.create("url", "username", "password")
// addExclude 增加排除表,可以增加多個
.strategyConfig(builder -> builder.addExclude("ums_administrator_role_relation"))
.execute();
首先,總覽一下 queryTables() 方法:
其中,
String tablesSql = dbQuery.tablesSql();
根據不同類型的數據庫獲取不同的基本查詢語句,該語句功能就就是查詢所有的數據庫表;- dbQuery.query 的作用,就是執行sql查詢語句,並且查詢到的每一行結果交給外層的都 Consumer 來處理。(這個類似訪問者模式)
- dbQuery.tableSql() 則是組裝查詢所有數據庫表的sql語句;
對象 dbQuery 的類是 com.baomidou.mybatisplus.generator.config.querys.DecoratorDbQuery,它的 tableSql 方法源碼如下:
下表反映的是這段代碼涉及到的參數:
StrategyConfig可調參數 | 默認值 | 備注 |
---|---|---|
enableSqlFilter | true | 啟用sql過濾,語法不能支持使用sql過濾表的話,可以考慮關閉此開關. |
likeTable | null | 包含表名 |
notLikeTable | null | 不包含表名 |
include | 空 | 指定包含表 |
exclude | 空 | 指定不包含表 |
結論1: 當enableSqlFilter設置為true時,likeTable和notLikeTable配置只能二選一;同樣,include和exclude配置也只能二選一
結論2: 當enableSqlFilter設置為true時,include和exclude設置成正則表達式無效!
下面給出 likeTable 的使用示例,notLikeTable 也類似:
FastAutoGenerator.create(properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password"))
.strategyConfig(builder -> builder.likeTable(new LikeTable("user", SqlLike.DEFAULT))) // 等於 %user%
.execute();
new LikeTable("user", SqlLike.LEFT) // 等於 %user
new LikeTable("user", SqlLike.RIGHT) // 等於 user%
繼續來看 queryTables() 的源碼:
這段代碼,稍稍需要理解的就是這個 matchIncludeTable 和 matchExcludeTable 方法了,跟蹤到最內層,就是
如果,用戶填寫的 include 或者 exclude,如果跟數據庫表名相同,就匹配上了,就可以把對應的 TableInfo 加入到 includeTableList 或者 excludeTableList 中了。
!!!但是,如果用戶填寫的 include 或者 exclude 是正則表達式的話,一定要把 enableSqlFilter 設置為 false!然后,如果數據表名和用戶設置的正則表達式匹配上,就算是命中了。