1.初始化Configuration对象
mybatis-config.xml这个文件主要是用于配置数据源、配置别名、加载mapper.xml。
mapper标签所指向的路径就是另外一个xml文件:xxxMapper.xml,而这个文件中写了我们查询数据库所用的SQL。
MyBatis实际上就是将这两个xml文件,用XMLConfigBuilder的parse()方法解析成配置对象
Configuration的核心配置类:
Environment environment:数据库环境
MapperRegistry mapperRegistry:保存解析到的所有映射器(mapper接口+mapper.xml)
Map<String, MappedStatement> mappedStatements:保存整个项目所有的SQL语句
Map<String, ResultMap> resultMaps:保存mapper.xml中配置的<resultMap>
Set<String> loadedResources:保存扫描到的所有的资源
点进去parse()方法,用XPath语法,获取核心配置的根节点
public Configuration parse() {
//查看该文件是否已经解析过
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
//如果没有解析过,则继续往下解析,并且将标识符置为true
parsed = true;
//解析<configuration>节点
parseConfiguration(parser.evalNode("/configuration"));//跟着configuration节点去解析它的子节点
return configuration;
}
点进去parseConfiguration()方法解析根节点下的子节点
private void parseConfiguration(XNode root) {
try {
//解析<Configuration>下的节点
//issue #117 read properties first
//<properties>
propertiesElement(root.evalNode("properties"));
//<settings>
Properties settings = settingsAsProperties(root.evalNode("settings"));
loadCustomVfs(settings);
loadCustomLogImpl(settings);
//别名<typeAliases>解析
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectorFactoryElement(root.evalNode("reflectorFactory"));
settingsElement(settings);
// read it after objectFactory and objectWrapperFactory issue #631
//配置环境
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
//主要 <mappers> 指向我们存放SQL的xxxxMapper.xml文件
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
每个解析不同标签的方法内部都对Config