mybatis源码结构图
数据管家——Configuration:
MyBatis在运行期的基本上所有的数据都会汇总到这个类。它的初始数据是来自开发人员配置在configuration的xml配置文件。通过用户配置的environments来获得系统运行的数据库环境,如事物管理以及数据源。下面给出了最基本的配置:
[html]
这些配置对于MyBatis需要做哪些工作呢?通过阅读Configuration的源码会发现,Mybatis其实为configuration标签下面的子标签都有一个对应的变量来进行存储,例如:
[java]
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
则是存储
[java]
private void parseConfiguration(XNode root) {
try {
propertiesElement(root.eva lNode("properties")); typeAliasesElement(root.eva lNode("typeAliases"));
pluginElement(root.eva lNode("plugins"));
objectFactoryElement(root.eva lNode("objectFactory"));
objectWrapperFactoryElement(root.eva lNode("objectWrapperFactory"));
settingsElement(root.eva lNode("settings"));
environmentsElement(root.eva lNode("environments"));
databaseIdProviderElement(root.eva lNode("databaseIdProvider"));
typeHandlerElement(root.eva lNode("typeHandlers"));
mapperElement(root.eva lNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
可以到,它为每个元素都对应了一个处理方法,这些方法将负责解析我们配置的XML文件。这里面我主要跟踪了几个方法的执行 www.2cto.com
(mapperElement,typeHandlerElement,typeAliasesElement,environmentsElement)
mapperElement——ORM
我们知道,MyBatis支持注解形式和XML形式的ORM配置。那么当然将会有两个类来处理这两种行为,它们分别是XMLMapperBuilder和MapperAnnotationBuilder,它们分别处理什么类型,我看我就不用说了。通过解析configuration/mappers元素来获得ORM配置信息。
1)XML方式的ORM配置和方式,当我们在mappers/mapper的属性中配置了url或者是resource信息的时候将触发MyBatis采用XML的方式进行处理,并读取你指定的mapper路径。在XMLMapperBuilder类中有如下方法:
[java]
private void configurationElement(XNode context) {
try {
String namespace = context.getStringAttribute("namespace");
builderAssistant.setCurrentNamespace(namespace);
cacheRefElement(context.eva lNode("cache-ref"));
cacheElement(context.eva lNode("cache"));
parameterMapElement(context.eva lNodes("/mapper/parameterMap"));
resultMapElements(context.eva lNodes("/mapper/resultMap"));
sqlElement(context.eva lNodes("/mapper/sql"));
buildStatementFromContext(context.eva lNodes("select|insert|update|delete"));
} catch (Exception e) {
throw new RuntimeException("Error parsing Mapper XML. Cause: " + e, e);
}
}
这个方法便是读取你mapper文件中所有制的ORM信息。该方法将通过调用XMLMapperBuilder的parse()方法触发。
2)注解方式配置ORM信息加载,当你配置了mappers/package或者在mapper里