# Mybatis源码解析:配置解析流程

在这里插入图片描述

# 解析配置

在我看mybatis源码的时候,大部分代码还是很简单的,DefaultResultSetHandler这个类是最难的,没有之一,debug了很多遍,还是没太搞懂,基于ResultSetHandler也并不是很重要,所以本系列我就不会写ResultSetHandler的内容了

mybatis解析配置阶段的代码还是比较简单的,基本上就是对配置文件中的各种属性进行解析,然后将值保存到Configuration对象中,因此直接画个流程图就略过了。比较重要的过程,比如sql的解析过程我会单开一节来分析

解析的过程用了建造者模式,将对象与对象的创建过程进行了解耦。建造者模式UML图如下 在这里插入图片描述

主要有如下4个角色:

  1. 建造者(Builder)接口:定义对象各部分的行为
  2. 具体建造者(ConcreteBuilder):一般来说有2种类型的方法,1.建造方法,如buildPart1(),2.获取构建好的产品对象的方法,如getProduct()方法
  3. 导演(Director):通过调用具体建造者,创建需要的产品
  4. 产品(Product):用户需要使用的复杂对象

mybatis中配置文件分为两部分,mybatis配置文件和mapper映射文件,用了不同的类来进行解析

文件
XMLConfigBuilder 主要负责解析mybatis-config.xml
XMLMapperBuilder 主要负责解析mapper.xml中的cache-ref,cache,parameterMap,resultMap,sql节点
XMLStatementBuilder 主要负责解析mapper.xml中的select,insert,update,delete这四类节点

当执行完如下2行代码,整个解析过程就完毕了,最后返回的SqlSessionFactory为DefaultSqlSessionFactory

Reader reader = Resources.getResourceAsReader("org/apache/ibatis/mytest/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

在这里插入图片描述 我把解析每个sql语句中比较重要的代码截出来了

org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode

在这里插入图片描述 最后把解析完成的sql封装成MappedStatement,并存到Configuration中,后续根据id就可以直接取到MappedStatement,然后执行sql 在这里插入图片描述 MappedStatement中有一个很重要的属性SqlSource,这是解析完sql后封装的一个对象,下节我们详细分析一下

在这里插入图片描述