【源码学习】mybatis-plus-generator源码阅读及原理分析

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工具,及其他贡献者,开源共享信息发展成果,学习使人更加秃头~

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值