阅读指南

mbg 项目地址: https://github.com/mybatis/generator.git 

 

mbg的用途:自动生成mybatis相关的数据访问代码,包括 java、xml、kotlin。

mbg的用法:目前支持通过ant task、maven 插件、java -jar三种形式调用mbg进行代码生成。

本文介绍mabatis generator core的代码结构和执行逻辑。

 

源码下载后分成两个大项目,core和eclipse,本文介绍的是core项目的一个子工程,即下图红框中的内容。

 

 

 

Basic Concept 和 包结构介绍

MyBatisGenerator

项目的主类,它本质上是执行mbg任务的入口,ant、maven、java -jar都调用MyBatisGenerator。

GeneratorAntTask

ant task的调用入口,它把MyBatisGenerator适配成ant task接口的形式,然后向外暴露。

MyBatisGeneratorMojo 

maven插件的调用入口,它把MyBatisGenerator适配成插件的形式,然后向外暴露给maven使用。

ShellRunner 

jvm的调用入口,它把MyBatisGenerator适配成java main接口的形式,然后向外暴露给jvm执行。

Configuration

与其说成configuration,不如说是arguments。它是传递给MyBatisGenerator的外部参数,对应的是xml参数配置,无论是ant、maven、还是java shell,都需要向mbg提供这个信息。

Context

一个独立的任务描述,它对应了Configuration xml文件中的<Context/>标签,一个<generatorConfiguration>可以有多个<Context/>标签,执行多个任务。mbg生成代码的过程,是以Context为单位的。

AbstractGenerator

文件生成器,最顶层的抽象类,不负责任何具体的代码生成。它有很多子类负责执行具体的代码生成和提供相关接口,例如JavaMapperGenerator、SimpleXMLMapperGenerator、KotlinDataClassGenerator。仅Java class的generator就有xml、annotation、mixed多种形式。如果你想开发新的特性,可以在这个继承树中扩展。

Plugin

这里的插件不是maven插件,而是给代码生成器generator使用的插件。generator通过组合使用不同的plugin来产生不同的效果。编写插件是第二种开发新特性的方式。

dom

以面向对象形式提供的,对代码文件(java、xml、kotlin)的描述。它屏蔽了将内容写入文件的具体细节,使得开发人员可以以面向对象的形式来描述要生成的文件内容。

包结构介绍

有了上面的概念,再来看项目的包结构就很清楚了。

ant包是ant调用入口

api包是各种接口定义和mybatisGenerator入口等

codegen是代码生成逻辑,即上面提到的generator继承树

config 解析xml参数

plugins 插件,generator使用的插件

 

 

代码调用逻辑

从mybatisGenerator的generate方法看起就可以了。

基本流程是:

1、把xml参数解析成configuration

2、设置一些callback回调(和主逻辑相关性不大,例如进度显示之类的)

3、进入mybatisGenerator的主入口

4、依次执行每个context任务,将生成的文件内容保存

5、把生成的文件写入磁盘

而context的执行则是调用了不同的generator,generator又会用到plugin

 

end