MyBatisGenerator源码分析MyBatis Generator 源码分析
资料:
⽂档:
下载:
快速开始:
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("l");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
源码分析:
1. MyBatisGenerator 构造器:没有做特别的事情,主要就是初始化并校验配置⽂件。
super();
if (configuration == null) {
throw new IllegalArgumentException(getString("RuntimeError.2"));
} else {
}
if (shellCallback == null) {
this.shellCallback = new DefaultShellCallback(false);
} else {
this.shellCallback = shellCallback;
}
if (warnings == null) {
this.warnings = new ArrayList<String>();
} else {
this.warnings = warnings;
}
generatedJavaFiles = new ArrayList<GeneratedJavaFile>();
generatedXmlFiles = new ArrayList<GeneratedXmlFile>();
projects = new HashSet<String>();
1. ⽣成⽂件:
if (callback == null) {
callback = new NullProgressCallback();
}
generatedJavaFiles.clear();
generatedXmlFiles.clear();
// 1.从配置⽂件中获取到上下⽂信息。对应配置⽂件的<context>标签,⼏乎所有的配置都在这个标签之内。 List<Context> contextsToRun;
if (contextIds == null || contextIds.size() == 0) {
contextsToRun = Contexts();
} else {
contextsToRun = new ArrayList<Context>();
for (Context context : Contexts()) {
if (Id())) {
contextsToRun.add(context);
}
}
}
// 2.加载⾃定义的class⽂件,主要⽤于加载数据库驱动。
if (ClassPathEntries().size() > 0) {
ClassLoader classLoader = ClassPathEntries());
ObjectFactory.addExternalClassLoader(classLoader);
}
// 3.统计处理步骤,并调⽤callback对应的⽅法。
int totalSteps = 0;
for (Context context : contextsToRun) {
totalSteps += IntrospectionSteps();
}
callback.introspectionStarted(totalSteps);
// 4.开始处理表信息,这⾥是⽣成代码的实际处理的第⼀步。
for (Context context : contextsToRun) {
context.introspectTables(callback, warnings,
fullyQualifiedTableNames);
}
// 5.类似于第3步,通常情况下没有什么⽤处。
totalSteps = 0;
for (Context context : contextsToRun) {
totalSteps += GenerationSteps();
}
// 6.开始⽣成⽂件,这⼀步是⽣成实际的⽂件。
for (Context context : contextsToRun) {
generatedXmlFiles, warnings);
}
// 7.将⽂件写到本地。
if (writeFiles) {
callback.saveStarted(generatedXmlFiles.size()
+ generatedJavaFiles.size());
for (GeneratedXmlFile gxf : generatedXmlFiles) {
projects.TargetProject());
writeGeneratedXmlFile(gxf, callback);
}
for (GeneratedJavaFile gjf : generatedJavaFiles) {
projects.TargetProject());
writeGeneratedJavaFile(gjf, callback);
}
for (String project : projects) {
}
}
callback.done();
a) 处理表信息:Context. introspectTables ⽅法 Context 的构造器的逻辑也没有特别的,只是简单的初始化。
introspectedTables = new ArrayList<IntrospectedTable>();
// 1.创建类型处理器,主要⽤于处理数据库数据类型与java类型的对应关系
JavaTypeResolver javaTypeResolver = ObjectFactory
.createJavaTypeResolver(this, warnings);
Connection connection = null;
try {
callback.startTask(getString("Progress.0"));
connection = getConnection();
//2.构造出数据库信息类来,这个构造器只是初始化了⼀些变量。
DatabaseIntrospector databaseIntrospector = new DatabaseIntrospector(
this, MetaData(), javaTypeResolver, warnings);
for (TableConfiguration tc : tableConfigurations) {
String tableName = Catalog(), tc
.getSchema(), tc.getTableName(), '.');
if (fullyQualifiedTableNames != null
&& fullyQualifiedTableNames.size() > 0
&& !ains(tableName)) {
continue;
}
if (!tc.areAnyStatementsEnabled()) {
warnings.add(getString("Warning.0", tableName));
continue;
}
callback.startTask(getString("Progress.1", tableName));
// 3.根据配置创建出IntrospectedTable类,此时已经将数据库栏位名称对应的字段名以及数据库数据类型对应的java类型都已经计算出来了。
List<IntrospectedTable> tables = databaseIntrospector
.introspectTables(tc);
if (tables != null) {
introspectedTables.addAll(tables);
}
callback.checkCancel();
}
} finally {
closeConnection(connection);
}
b) ⽣成⽂件:ateFiles
pluginAggregator = new PluginAggregator();
// 1.处理插件信息.暂时先忽略
for (PluginConfiguration pluginConfiguration : pluginConfigurations) {
Plugin plugin = atePlugin(this,
pluginConfiguration);
if (plugin.validate(warnings)) {
pluginAggregator.addPlugin(plugin);java xml是什么
} else {
warnings.add(getString("Warning.24", //$NON-NLS-1$
}
}
if (introspectedTables != null) {
for (IntrospectedTable introspectedTable : introspectedTables) {
callback.checkCancel();
//2.初始化相关属性.
introspectedTable.initialize();
//3.计算出需要使⽤的⽣成器.
introspectedTable.calculateGenerators(warnings, callback);
generatedJavaFiles.addAll(introspectedTable
.getGeneratedJavaFiles());
generatedXmlFiles.addAll(introspectedTable
.getGeneratedXmlFiles());
generatedJavaFiles.addAll(pluginAggregator
.contextGenerateAdditionalJavaFiles(introspectedTable));
generatedXmlFiles.addAll(pluginAggregator
.contextGenerateAdditionalXmlFiles(introspectedTable));
}
}
generatedJavaFiles.addAll(pluginAggregator
.
contextGenerateAdditionalJavaFiles());
generatedXmlFiles.addAll(pluginAggregator
.contextGenerateAdditionalXmlFiles());
c) 写⼊到本地⽂件中:调⽤GeneratedJavaFile的getFormattedContent⽅法获得java⽂件内容;调⽤GeneratedXmlFile的getFormattedContent⽅法获得xml⽂件的内容。
1. Generator:下⾯重点看下⽂件⽣成器,mybatis-generator提供了很多⽂件⽣成器,有mybatis xml⽂件⽣成器,也有java⽂件⽣
成器,其中java⽂件⽣成器也有很多种,这⾥只看⼏个常⽤的简单的。
a) DAOGenerator:在getCompilationUnits⽅法中构造出TopLevelClass和Interface,并根据之前构造的信息向类和接⼝中添加⼀
系列的⽅法,此不详述,详细参见源码。在写出⽂件是调⽤的getFormattedContent实际上就是这两个类的⽅法。
b) JavaMapperGenerator:在这个类中的getCompilationUnits⽅法只构造出了Interface,其他与DAOGenerator类似。
c) XMLMapperGenerator:在getDocument⽅法中构造出了⼀个document。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论