Mybatis-运行原理

目录

  • SqlSessionFactory初始化
  • openSession获取SqlSession对象
  • GetMapper获取到接口的代理对象
  • 查询实现
  • Mybatis运行原理总结

SqlSessionFactory初始化

Mybatis-运行原理_第1张图片

总结

把配置文件的信息解析并保存在Congratulation对象中,返回包含了Configuration的DefauConfiguration

MapperStatement:代表一个增删改查的详细信息

详细步骤

创建SqlSessionFactoryBuilder对象,调用build方法

Mybatis-运行原理_第2张图片

创建解析器parser,用解析器把每一个标签详细信息保存在Congratulation中

Mybatis-运行原理_第3张图片

Mybatis-运行原理_第4张图片

解析setting.xml

Mybatis-运行原理_第5张图片

解析mapper.xml

mapper.xml中的每一个元素信息解析出来并保存在全局配置中将增删改查标签的每一个标签属性都解析出来封装成一个MapperStatement,一个MapperStatement就代表一个增删改查的详细信息

Mybatis-运行原理_第6张图片

Mybatis-运行原理_第7张图片

Mybatis-运行原理_第8张图片

返回Configuration对象

Mybatis-运行原理_第9张图片

调用build方法创建DefaultConfiguration,DefaultConfiguration包含了保存全局配置信息的Configuration

Mybatis-运行原理_第10张图片

openSession获取SqlSession对象

返回一个DefaultConfiguration对象,包含了Configuration和Executor,Executor会在此被创建

Mybatis-运行原理_第11张图片

详细步骤

image-20210513225338324

image-20210513224449661

构建Executor执行器

Mybatis-运行原理_第12张图片

Mybatis-运行原理_第13张图片

将原生执行器封装成缓存执行器

Mybatis-运行原理_第14张图片

通过插件拦截器链实现所有插件

Mybatis-运行原理_第15张图片

返回包含了Configuration和Executor的DefaultConfiguration对象

Mybatis-运行原理_第16张图片

GetMapper获取到接口的代理对象

返回一个MapperProxy类型的代理对象

Mybatis-运行原理_第17张图片

详细步骤

调用getMapper方法

image-20210513231127238

image-20210513231133219

创建MapperProxy代理对象

Mybatis-运行原理_第18张图片

返回MapperProxy的代理对象

Mybatis-运行原理_第19张图片

Mybatis-运行原理_第20张图片

查询实现

Mybatis-运行原理_第21张图片

MapperProxy使用代理对象使用invoke方法调用MapperMethod传入会话和参数

Mybatis-运行原理_第22张图片

Mybatis-运行原理_第23张图片

Mybatis-运行原理_第24张图片

查询多个就调用executeMany()单个查询selectOne

Mybatis-运行原理_第25张图片

调用Executor的query方法

Mybatis-运行原理_第26张图片

wrapToMapIfCollection封装复杂类型到参数map集合

Mybatis-运行原理_第27张图片

query会获取到BoundSql和CacheKey

Mybatis-运行原理_第28张图片

BoundSql是包含了这个sql的所有详细信息(包含了sql语句 参数 类型等等 )

Mybatis-运行原理_第29张图片

CacheKey包含了缓存的信息,key值是:方法+id+参数xxx生成

Mybatis-运行原理_第30张图片

如下二个缓存的获取方法也证明了,如果mabits开启了缓存,会先调用CacheExecutor的query获取以名称空间为范围的二级缓存,如果没有就会调用BasicExecutor的query方法获取以session为范围的一级缓存,如果没有找到缓存 才会调用queryFromDatabase查询数据库

Mybatis-运行原理_第31张图片

Mybatis-运行原理_第32张图片

Mybatis-运行原理_第33张图片

Mybatis-运行原理_第34张图片

创建StatementHandler对象

image-20210514163145304

image-20210514163201305

Mybatis-运行原理_第35张图片

创建StatementHandler对象的同时分别创建出parameterHandler和resultSetHandler

Mybatis-运行原理_第36张图片

Mybatis-运行原理_第37张图片

调用prepareStatement方法创建原生JDBCStatement对象

Mybatis-运行原理_第38张图片

Mybatis-运行原理_第39张图片

返回list后续连接关闭

Mybatis-运行原理_第40张图片

Mybatis-运行原理_第41张图片

Mybatis运行原理总结

  1. 通过加载mybatis全局配置文件以及mapper映射文件初始化configuration对象 和Executor对象(通过全局配置文件中的defaultExecutorType初始化);
  2. 创建一个defaultSqlSession对象,将configuration对象和Executor对象注入给defaulSqlSession对象中;
  3. defaulSqlSession通过getMapper()获取mapper接口的代理对象mapperProxy(mapperProxy中包含defaultSQLSession对象)
  4. 执行增删改查
    1. 通过defaulSqlSession中的属性Executor创建statementHandler对象;
    2. 创建statementHandler对象的同时也创建parameterHandler和resultSetHandler;
    3. 通过parameterHandler设置预编译参数及参数值;
    4. 调用statementHandler执行增删改查;
    5. 通过resultsetHandler封装查询结果

你可能感兴趣的:(Mybatis)