Mybatis源码分析(原创)
@test

1.进入SqlSessionFactoryBuilder中build方法

2.进入XMLConfigBuilder类中parse->parseConfiguration中 通过该方法去解析mybatis-config.xml


3.在mapperElement方法去解析我们的<mapper resource="mybatis/UserMapper.xml"/> 我们在导入mapper时有三种方法 resource url class

4.通过parseConfiguration方法解析好的xml中的数据返回到Configuration中存储 下面为部分代码

5.接下来在Test类中看到 我们进入openSession方法

在openSessionFromDataSource中通过configuration.getDefaultExecutorType()传入执行器类型 默认SIMPLE(简单) reuse(复用) BATCH(批量)

在openSessionFromDataSource方法中 去创建事物 并且获得我们的执行器newExecutor
在执行器中找到我们默认的SIMPLE 通过executor = new CachingExecutor(executor);
设置一级缓存(此处默认开启一级缓存 仅用于session范围 )
mybatis一级缓存二级缓存学习资料(https://www.cnblogs.com/happyflyingpig/p/7739749.html)

6.接下来在Test类中看到 我们进入selectOne方法

在MappedStatement类中去分装Mapper.xml中select属性

此时我们通过selectList进入query 再进入getBoundSql 该方法去获得我们的sql语句和相关的参数


在query方法中 通过createCacheKey创建缓存的key(自动缓存)
此处给sql创建一个key id+sql+limit+offsetxxx

在query返回结果中再次调用query去查我们的缓存 key 如果为空则去数据库中查找 否则走缓存

当我们去查数据库时通过queryFromDatabase 进入doQuery方法中
在该方法中拿到我们上面做好的Configuration信息

进入newStatementHandler请求相关的责任链的方式(拦截器)
doQuery方法中handler调用query 此时底层调用的jdbc

此时返回resultSetHandler 数据库结果集



此时multipleResults中 存储着从数据库中查出来的数据
Mybatis源码分析(原创)的更多相关文章
- (一) Mybatis源码分析-解析器模块
Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...
- MyBatis源码分析-MyBatis初始化流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析-SQL语句执行的完整流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析(5)——内置DataSource实现
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...
- MyBatis源码分析(4)—— Cache构建以及应用
@(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...
- MyBatis源码分析(3)—— Cache接口以及实现
@(MyBatis)[Cache] MyBatis源码分析--Cache接口以及实现 Cache接口 MyBatis中的Cache以SPI实现,给需要集成其它Cache或者自定义Cache提供了接口. ...
- MyBatis源码分析(2)—— Plugin原理
@(MyBatis)[Plugin] MyBatis源码分析--Plugin原理 Plugin原理 Plugin的实现采用了Java的动态代理,应用了责任链设计模式 InterceptorChain ...
- 【MyBatis源码分析】select源码分析及小结
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...
- MyBatis源码分析之环境准备篇
前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...
- Mybatis源码分析-BaseExecutor
根据前文Mybatis源码分析-SqlSessionTemplate的简单分析,对于SqlSession的CURD操作都需要经过Executor接口的update/query方法,本文将分析下Base ...
随机推荐
- 【Unity游戏开发】你真的了解UGUI中的IPointerClickHandler吗?
一.引子 马三在最近的开发工作中遇到了一个比较有意思的bug:“TableViewCell上面的某些自定义UI组件不能响应点击事件,并且它的父容器TableView也不能响应点击事件,但是TableV ...
- JavaScript 归纳
MDN 本文以 NodeJS 为交互解释器实验 尽量遵循 ES6 标准 javascript 重点 1.javascript 是单线程,通过 EventLoop 实现模拟异步,其中包括宏任务,微任务 ...
- JAVA通过http访问其他服务端API
项目要实现这么一个功能,用户通过点击按钮,通过axios来访问python的API(算法,java不好做)得到一个结果存储到数据库并且返回到页面. 但是python不是在tomcat上面运行的,所以不 ...
- 查看变更(git diff)
git diff命令 如果想要知道变更的具体内容,可以使用git diff命令.它被用来解决两个问题: 哪些变更还没有被暂存? 那些已暂存的变更正待提价? git diff在git status基础上 ...
- Flask 之东方不败一
1,flask的初始 flask是Python的一个轻量级的web框架,相当于django而言. 知识点Python 三大主流web框架的对比 1.Django 主要特点是大而全,集成了很多组件,例如 ...
- HG奋斗赛B[20190429]
T1 >传送门< 记忆化搜索,听说有更简单的方法(但博主比较菜) #include <cstdio> #include <cstdlib> #define ll l ...
- 支持向量机SVM——专治线性不可分
SVM原理 线性可分与线性不可分 线性可分 线性不可分-------[无论用哪条直线都无法将女生情绪正确分类] SVM的核函数可以帮助我们: 假设‘开心’是轻飘飘的,“不开心”是沉重的 将三维视图还原 ...
- ABP core学习之一 使用Mysql数据库
修改项目EntityFrameworkCore的相关内容 1.添加类库 使用nuget包管理器,添加Pomelo.EntityFrameworkCore.MySql 2.TradeErpDbConte ...
- Asp.Net Core配置Swagger
本文主要参考:Using Swagger with ASP.net Core 1.创建WebApi项目 本文使用ASP.Net Core Web API项目模板演示Swagger到使用,首先创建Web ...
- <A>标记onclick事件
<script> function ss() { document.getElementById("btnPublicity").click(); }</scri ...