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() 的源码:

这段代码,稍稍需要理解的就是这个 matchIncludeTablematchExcludeTable 方法了,跟踪到最内层,就是

如果,用户填写的 include 或者 exclude,如果跟数据库表名相同,就匹配上了,就可以把对应的 TableInfo 加入到 includeTableList 或者 excludeTableList 中了。
!!!但是,如果用户填写的 include 或者 exclude 是正则表达式的话,一定要把 enableSqlFilter 设置为 false!然后,如果数据表名和用户设置的正则表达式匹配上,就算是命中了。

posted @ 2022-04-09 18:32  极客子羽  阅读(1725)  评论(0编辑  收藏  举报