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运行原理总结
- 通过加载mybatis全局配置文件以及mapper映射文件初始化configuration对象 和Executor对象(通过全局配置文件中的defaultExecutorType初始化);
- 创建一个defaultSqlSession对象,将configuration对象和Executor对象注入给defaulSqlSession对象中;
- defaulSqlSession通过getMapper()获取mapper接口的代理对象mapperProxy(mapperProxy中包含defaultSQLSession对象)
- 执行增删改查
- 通过defaulSqlSession中的属性Executor创建statementHandler对象;
- 创建statementHandler对象的同时也创建parameterHandler和resultSetHandler;
- 通过parameterHandler设置预编译参数及参数值;
- 调用statementHandler执行增删改查;
- 通过resultsetHandler封装查询结果
转载:https://blog.csdn.net/xiaoyixiao_/article/details/116770762