我总共分成了四小节,更多请见
02.MyBatis原理分析之SqlSession
03.MyBatis原理分析MapperProxy
04.MyBatis源码分析之查询操作
1. Test
2. SqlSessionFactoryBuilder
-
org.apache.ibatis.session.SqlSessionFactoryBuilder
-
根据配置文件(全局配置文件+sql 映射文件)开始解析
3. XMLConfigBuilder
-
org.apache.ibatis.builder.xml.XMLConfigBuilder
-
此类主要用来解析全局配置文件
3.1 parse()
- mybatis 的全局配置文件父节点是 configuration,所以从这里开始解析
3.2 parseConfiguration(XNode root)
- 对全局配置文件的每一个节点进行解析,然后放到 configuration 对象中,在这里我们只分析遇到 mappers 节点会如何解析,因为 mapperss 节点会解析 sql 映射文件
3.3 mapperElement(XNode parent)
- 因为是用 resource 加载资源,所以进入此方法
4. XMLMapperBuilder
-
org.apache.ibatis.builder.xml.XMLMapperBuilder
-
此类主要用来解析 sql 映射文件
4.1 parse()
- 从映射文件的 mapper 节点开始解析
4.2 configurationElement(XNode context)
- 会解析 mapper 文件的所有节点,在这里我们只对 select|insert|update|delete 标签分析
4.3 buildStatementFromContext(List list)
4.4 buildStatementFromContext(List list, String requiredDatabaseId)
5. XMLStatementBuilder
-
org.apache.ibatis.builder.xml.XMLStatementBuilder
-
对每个标签开始进行解析
6. MapperBuilderAssistant
-
org.apache.ibatis.builder.MapperBuilderAssistant
-
构建出一个 statement 对象
7. Configuration
- org.apache.ibatis.session.Configuration
7.1 addMappedStatement(MappedStatement ms)
- 每个 ms 就代表一个增删改查的详细信息,把它添加到 mappedStatements
7.2 put(String key, V value)
- mappedStatements 实际上继承了 HashMap,重写了 put 方法,所以每次添加会添加两个值(一个短 id,一个原本 id)
8. Test
- 最终 sqlSessionFactory 里的 configuration 包含了所有的 配置文件信息