飞道的博客

Mybatis-运行原理

247人阅读  评论(0)

SqlSessionFactory初始化

总结

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

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

详细步骤

创建SqlSessionFactoryBuilder对象,调用build方法

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

解析setting.xml

解析mapper.xml

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

返回Configuration对象

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

openSession获取SqlSession对象

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

详细步骤

构建Executor执行器

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

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

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

GetMapper获取到接口的代理对象

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

详细步骤

调用getMapper方法

创建MapperProxy代理对象

返回MapperProxy的代理对象

查询实现

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

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

调用Executor的query方法

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

query会获取到BoundSql和CacheKey

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

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

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

创建StatementHandler对象

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

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

返回list后续连接关闭

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封装查询结果

转载:https://blog.csdn.net/xiaoyixiao_/article/details/116770762
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场