Mybatis架构,SqlSessionFactory源码分析

下一篇:SqlSession源码分析

1. Mybatis架构

  •  接口层:增加接口方法,删除、修改、查询、各种直接使用的配置方法
  • 数据处理层:参数处理(处理parameterType的参数)、SQL解析(解析器)、SQL执行(通过Executor对象)、处理结果(resultType或者resultMap返回的结果)
  • 框架支撑层:事务管理(标签)、缓存机制()、连接池管理(environment标签中的
  • 引导层:SQL语句的方式:XML配置或注解方式

2. Mybatis中步骤

  1. 获取SqlSessionFactory对象
  2. 获取SqlSession对象
  3. 获取xxxMapper对象-》代理接口的方法,也可以是代理mapper.xml中的标签定义的sql语句

Mybatis架构,SqlSessionFactory源码分析_第1张图片

 1. SqlSessionFactory源码分析

Mybatis架构,SqlSessionFactory源码分析_第2张图片

2. 

Mybatis架构,SqlSessionFactory源码分析_第3张图片

进入build()方法,返回值是一个parser.parse()对象

 Mybatis架构,SqlSessionFactory源码分析_第4张图片

 所以是通过一个parse()解析器返回对象

Mybatis架构,SqlSessionFactory源码分析_第5张图片

 进入parse()方法可以看到,返回的是一个Configuration对象

Mybatis架构,SqlSessionFactory源码分析_第6张图片

 看看parse()方法是如何返回Configuration对象的,里面有parseConfiguration()方法解析configuration对象

Mybatis架构,SqlSessionFactory源码分析_第7张图片

 Mybatis架构,SqlSessionFactory源码分析_第8张图片

Mybatis配置文件中的标签如下:里面的typeAliases、environments、mappers配置信息同上

 Mybatis架构,SqlSessionFactory源码分析_第9张图片

配置文件中的标签,全部通过parseConfiguration()方法解析,选一个settingsElement方法进入,看看如何解析settings标签的Mybatis架构,SqlSessionFactory源码分析_第10张图片

 进入以后可以看到,我们在settings标签中配置的缓存和延迟加载等属性都保存在了一个configuration对象Mybatis架构,SqlSessionFactory源码分析_第11张图片

Mybatis架构,SqlSessionFactory源码分析_第12张图片

 刚刚看了settingsElement()方法,再看看怎么解析mapper的mapperElement()方法

Mybatis架构,SqlSessionFactory源码分析_第13张图片

 Mybatis架构,SqlSessionFactory源码分析_第14张图片

不是package,看看XMLMapperBuilder对象的parse()方法

 Mybatis架构,SqlSessionFactory源码分析_第15张图片

进入mapperParser.parse()方法,

 Mybatis架构,SqlSessionFactory源码分析_第16张图片

parse()方法有个configurationElement()方法

 Mybatis架构,SqlSessionFactory源码分析_第17张图片

 看看configurationElement()方法Mybatis架构,SqlSessionFactory源码分析_第18张图片

 进入buildStratemetnFromContext()方法,看看如何分析select等标签

先分析select标签有没有databaseId属性

 Mybatis架构,SqlSessionFactory源码分析_第19张图片

如果mapper.xml文件select标签的databaseId不为空,调用buildStatementFromContext(list,this.configuration.getDatabaseId())方法

 Mybatis架构,SqlSessionFactory源码分析_第20张图片

 Mybatis架构,SqlSessionFactory源码分析_第21张图片

 进入parseStatementNode()方法,该方法把mapper文件的配置信息,封装为String类型的数据:id,datdabaseId,.....

所以等标签解析成MappedStatement对象

所以MappedStatement对象就是