架构图

流程图

配置读取

SqlSessionFactoryBuilder

通过SqlSessionFactoryBuilder读取配置文件生成SqlSessionFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
// xml属性解析
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
// 从xml配置文件中获取生成sqlSessionFactory需要的配置信息
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}

mapper.xml文件解析

XMLMapperBuilder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void parse() {
// 判断该文件有没有被解析
if (!configuration.isResourceLoaded(resource)) {
// 解析mapper.xml的数据
configurationElement(parser.evalNode("/mapper"));
// 标识该配置文件已经被解析
configuration.addLoadedResource(resource);
// 将namespance和mapper绑定
bindMapperForNamespace();
}

parsePendingResultMaps();
parsePendingCacheRefs();
parsePendingStatements();
}

sql解析

SqlSouce

根据xml文件或映射语句解析成sql

实现类

RawSqlSouce

负责处理静态sql,并将封装好的sql封装为StaticSqlSource返回

StaticSqlSource

处理静态sql可能含有”?”占位符,可以被数据直接执行

ProviderSqlSouce

处理方法上含有”@ProviderXXX”注解的sqlSource实现类

DynamicSqlSource

负责处理动态sql

sql执行

Executor

sql执行器

StatementHandler

最终由该组件负责sql执行