mybatis-plus 是一个中小企业广泛使用的ORM持久层工具,但是generator使用文档网络上却很少因此为了更好的学习了解generator的使用,在此对源码进行学习,本文按照mybatis-plus-generator 3.5.3版本进行分析,文档编写日期为2024年6月17日。后续版本变化以最新源码为准。
可参考文档: mybatis-plus官网
一 拉取源码
源码github仓库位置:https://github.com/baomidou/generator (国内访问需要小施魔法)
码云自用学习Fock仓库位置:https://gitee.com/zeyangwu/generator
二 环境准备
由于mybatis-plus-generator 是使用 gradle 进行包管理的,在这里你需要配置 gradle 环境 本次教程主要是讲 generator 项目源码,不赘述 gradle 环境搭建。
三 源码分析
3.1 项目总览(红框处)
AutoGenerator和FastAutoGenerator是generator的两个入口文件,分别是快速生成和交互生成,两个原理基本相同这里按照AutoGenerator进行展开。
3.2 入口文件分析
AutoGenerator的构造函数注入数据源配置
其他的配置也通过方法注入对象,同时返回AutoGenerator对象本身
execute方法则是最终调用的方法,在方法中将对象中的给类配置项传递给ConfigBuilder构建整体的配置,同时注入templateEngine对象,templateEngine对象是实现模版输出的关键,在实现时继承了AbstractTemplateEngine抽象类,实现文件生成,同时templateEngine实现了给类模版生成器的初始化,后续分析讲。
3.3 数据源配置
DataSourceConfig类是一个必须存在的类,主要用于创建数据库连接,为后续生成提取数据库元信息提供连接依据。DataSourceConfig类在config下采用构建者模式生成。构建方式有两种,一种是提供url、username、password构建连接、一种是通过注入外部数据源DataSource构建,官网demo采用第一种构建。
在构建的时候通过内部类Builder,将数据源信息传递给DataSourceConfig,构建完成调用build完成构建。
其余的方法则是向DataSourceConfig传递数据源构建信息。
在DataSourceConfig中提供了数据源处理方法,比如判断数据源类型等。都比较简单,一看就懂。
3.4 其他配置
BaseBuilder是配置构建类,在这里提供了entity、controller、mapper、service类的构建实例方法、通过构造函数传入strategyConfig构建策略类完成构建方法实例的构造构,build函数输出strategyConfig类。该类继承IConfigBuilder配置构建接口类,实现了build函数。
IConfigBuilder是个泛型类接口类,build输出泛型类本身。
entity、controller、mapper、service等类的内部构造类继承BaseBuilder类。
在构造函数中均调用了BaseBuilder的构造函数向BaseBuilder中传递了strategyConfig类。其余的方法均是向配置类中传递相关配置,同时配置类中实现了renderData方法,该方法是通过TableInfo(数据库表信息)构造出对应实例的渲染数据,这里输出的数据在模版中会进行处理。
其余的配置类原理相同。
ConfigBuilder类作为汇总类通过构造方法汇总entity、controller、mapper、service、strategyConfig、GlobalConfig等类,在入口文件的execute方法中通过该类的构造方法注入配置。
同时该类也提供了表信息的注入和各类配置的注入。
GeneratorBuilder则提供了各配置类的实例对象生成方法。
PathInfoHandler则是处理路径的方法工具类。
3.5 类型转换
ITypeConvert提供了类型转换接口,具体实现则在converts包下,converts包下的类提供了已支持的给类数据库类型转换的实现方法。
converts包下的select则converts策略转换器,selector类则实现策略具体功能
3.6 数据库元信息
po包下提供了数据库元信息,由于各类数据库获取元信息的方式不同,IDbQuery提供了元信息查询接口,具体实现则在querys包下。首先AbstractDbQuery抽象类实现了IDbQuery,其他各类数据库实现则继承AbstractDbQuery抽象类。
3.7 规则
在rules包下定义了date类导包规则、名称转换规则、和数据库字段类型转换规则的方法也提供了IColumnType字段类型转换规则的接口和INameConvert包名转换的接口,便于二次开发使用。
3.8 常量定义
ConstVal采用接口的方式提供了通用常量。
3.9 渲染注入配置
InjectionConfig类将给配置渲染数据整合到这里提供模版渲染数据。
3.10 包配置
PackageConfig则是包配置类和其他配置一样采用构建者模式完成属性配置。
3.11 策略配置
StrategyConfig与其他配置一样采用构建者模式,继承BaseBuilder完成配置构建。
3.12 模版配置
TemplateConfig与其他配置一样采用构建者模式,实现了IConfigBuilder构建配置。
3.13 模版渲染实现
engine包下实现了BeetlTemplate、FreemarkerTemplate、VelocityTemplate三种类型的模版实现,因此在使用时应该引入对应的模版组件jar。
AbstractTemplateEngine中提供了controller、mapper、entity、service的实现方法,和init、writer、templateFilePath抽象方法,分别是初始化模版、模版渲染与模版路径读取。
通过初始化和实现抽象方法的方式使得各类模版的实现能够统一。
3.14 填充处理
Column和Property分别实现IFill的接口用于填充渲染属性及字段数据。
3.15 数据库元数据读取
DatabaseMetaDataWrapper用于读取数据库元数据配合po包、querys包使用。
3.16 关键字处理
keywords包用于处理给类数据库的关键字。实现了IKeyWordsHandle接口。
3.17 数据库查询
query提供数据库查询方法,实现了IDatabaseQuery,也是通过抽象类实现对接口的实现。
3.18 类型处理
type包则实现对数据库类型处理。
3.19 工具类
util包提供了类处理工具、文件处理工具、运行工具。既然是工具类方法均是静态方法,可使用静态调用。
四 小结
generator项目使用到了大量使用了构造者模式,使得使用时把构建结果和过程分开,更加流畅的书写便于阅读。也大量使用了抽象类及接口便于对同一特新的对象进行重复构建,在后期使用中便于开发注入和统一调用。美中不足的是包的整体结构率显混乱层次上缺乏统一,但是不影响源码阅读与使用。代码没有太多高级特性,初学者也可以快速阅读掌握工具的使用方法。
五 demo
这里贴出官方文档的快速生成demo
public static void main(String[] args) {
FastAutoGenerator.create("url", "username", "password")
.globalConfig(builder -> {
builder.author("baomidou") // 设置作者
.enableSwagger() // 开启 swagger 模式
.outputDir("D://"); // 指定输出目录
})
.dataSourceConfig(builder ->
builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT) {
// 自定义类型转换
return DbColumnType.INTEGER;
}
return typeRegistry.getColumnType(metaInfo);
})
)
.packageConfig(builder ->
builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
.moduleName("system") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, "D://")) // 设置mapperXml生成路径
)
.strategyConfig(builder ->
builder.addInclude("t_simple") // 设置需要生成的表名
.addTablePrefix("t_", "c_") // 设置过滤表前缀
)
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
六 文档及配置属性
新版官方文档: https://baomidou.com/guides/new-code-generator/
新版代码生成器配置: https://baomidou.com/reference/code-generator-configuration/
七 感谢
感谢青苗大佬提供的MP工具,及其他贡献者,开源共享信息发展成果,学习使人更加秃头~