MybatisPlus最新代码生成器(3.5.1+)使用教程(3)——指定数据库表详细解析
简介
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!然后,如果数据表名和用户设置的正则表达式匹配上,就算是命中了。