【原创文章,转载请注明原文章地址,谢谢!】
注意:以下代码都有适当修改和删改,为了更好看清楚执行流程
首先是简单分析使用Shell Runner执行MBG的最概略的执行流程分析:
org.mybatis.generator.api.ShellRunner:运行MyBatis Generator 的Main入口类;
核心代码(main方法):
//解析命令行
Map<String, String> arguments = parseCommandLine(args);
//创建一个警告列表,整个MBG运行过程中的所有警告信息都放在这个列表中,执行完成后统一System.out
List<String> warnings = new ArrayList<String>();
//得到generatorConfig.xml文件
String configfile = arguments.get(CONFIG_FILE);
File configurationFile = new File(configfile);
Set<String> fullyqualifiedTables = new HashSet<String>();//如果参数有tables,得到table名称列表
Set<String> contexts = new HashSet<String>();//如果参数有contextids,得到context名称列表
try {
//创建配置解析器
ConfigurationParser cp = new ConfigurationParser(warnings);
//调用配置解析器创建配置对象(Configuration对象非常简单,可以简单理解为包含两个列表,一个列表是List<Context> contexts,包含了解析出来的Context对象,一个是List<String> classPathEntries,包含了配置的classPathEntry的location值)
Configuration config = cp.parseConfiguration(configurationFile);
//创建一个默认的ShellCallback对象,之前说过,shellcallback接口主要用来处理文件的创建和合并,传入overwrite参数;默认的shellcallback是不支持文件合并的;
DefaultShellCallback shellCallback = new DefaultShellCallback(
arguments.containsKey(OVERWRITE));
//创建一个MyBatisGenerator对象。MyBatisGenerator类是真正用来执行生成动作的类
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);
//创建一个默认的ProgressCallback对象,之前说过,在MBG执行过程中在一定的执行步骤结束后调用ProgressCallback对象的方法,达到执行过程监控的效果;
//如果在执行ShellRunner是传入了-verbose参数,那么创建一个VerboseProgressCallback(VerboseProgressCallback只是调用了System.out打印出了执行过程而已)
ProgressCallback progressCallback = arguments.containsKey(VERBOSE) ? new VerboseProgressCallback()
: null;
//执行真正的MBG创建过程
//注意,这里的contexts是通过-contextids传入的需要的上下文id列表;
//fullyqualifiedTables是通过-tables传入的本次需要生成的table名称列表;
myBatisGenerator.generate(progressCallback, contexts, fullyqualifiedTables);
}catch(...){...}