阅读mybatis的源码的思路
■ 阅读源码mybatis操作数据库的过程:
/* 测试查询 */
@Test
public void testGet() throws IOException {
// 1、从classpath路径加载mybatis全局配置文件mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建SqlSessoinFactory会话工厂对象,好比连接池DataSource
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3、创建SqlSession会话对象,好比连接对象Connection
SqlSession session = factory.openSession();
// 4、获取mapper对象
UserMapper mapper = session.getMapper(UserMapper.class);
//执行sql操作
User user = mapper.get(1L);
System.out.println(user);
// 5、关闭资源
session.close();
}
(1)创建SqlSessoinFactory会话工厂对象
- 查看源码得知,表名上是创建了一个SqlSessoinFactory会话工厂对象, 实际上在创建SqlSessoinFactory会话工厂对象的时候还创建了一个全局配置对象。【咱还顺带看了一下全局配置的创建过程啦】
(2)创建SqlSessoin会话对象
查看源码得知,表名上是创建了一个SqlSessoin会话对象, 实际上在创建SqlSessoin会话对象的时候还创建了一个全执行器对象。【咱还顺带看了一下执行器的创建过程啦】
执行器对象Executor【
CachingExcutor(Simple)带有缓存的执行器
】,是mybatis的调度中心,负责sql的生成和查询缓存维护。在创建SqlSessoin会话对象创建,会执行pluginAll方法
(3)创建mapper对象
- 查看源码得知,创建mapper对象, 实际上通过jdk的代理机制创建了一个mapper的代理对象。
(4) 执行sql操作:mapper.get(1L);
- 先判断传入的方法类型,不是Object类型,就使用映射方法进行执行
- 执行的时候会根据元素类型进行选择
- 咱执行mapper.get(1L)实际上是会话对象调用selectOne方法
- selectOne 返回一个集合list,观察selectList
- 映射语句mapperStatement封装了元素的信息
- 在selectList方法看到执行器调用查询方法
- 发现执行查询的过程,先经过CachingExcutor(带有二级缓存的执行器),先从二级缓存中寻找是否有数据
- 发现执行查询的过程,经过BaseExcutor(底层的执行器),先从一级缓存localCache中寻找是否有数据,若是没有在从数据库中查询
- 从数据库查询,是简单的执行器,调用doQuery方法
- 构建语句处理器对象
- 构建RoutingStatementHandler语句处理器对象
- 构建PreparedStatementHandler预编译语句处理器对象
- 构建ParameterHandler参数处理器对象、构建ParameterHandler参数处理器对象
- ★ Statement(PreparedStatement 预编译语句对象)创建对象之前,先创建参数处理器和结果处理器
□ ParamterHandler 参数处理器,先把用户传入的参数转成JDBC需要的参数值,在创建对象之前,会执行pluginAll方法
□ ResultSetHandler 结果集处理器,把结果集中的数据封装到list集合,在创建对象之前,会执行pluginAll方法
- 实例化一个语句对象
。。。
✿ 总结阅读mybatis执行sql的源码中的核心对象:
InterceptorChaiin 拦截器链,多个拦截器合成
Configuration 全局配置对象,封装了所有的配置信息
Executor 执行器,myBatis的调度中心,负责sql生成和查询缓存维护,在创建sqlSession对象之前。创建 ok之后,会执行pluginAll方法
- BaseExecutor 底层的执行器,先从一级缓存中查询,若没有,则到数据库中查询
- CachingExcutor(Simple) 带有二级缓存的执行器,先去二级缓存中寻找是否有数据
MappedStatement 映射语句对象,封装了一个元素节点(insert|delete|update|select)的信息
StatementHandler 语句处理器,封装了JDBC的DML/DQL操作,参数设置,在创建对象时,执行pluginAll方法
- RoutingStatement
TypeHandler 类型转化器,把java类型和JDBC类型做相互转化操作,参数处理器、结果集处理器都会用到它。
■ 在创建StatementHandler 创建对象之前,先创建参数处理器和结果集处理器
□ ParameterHandler 参数处理器,把用户传入的参数转化为JDBC需要的参数值,在创建对象时,执行 pluginAll方法
□ ResultSetrHandler 结果集处理器,在结果集中的数据封装到List集合,在创建对象时,执行 pluginAll方法
阅读mybatis的源码的思路的更多相关文章
- 读源码【读mybatis的源码的思路】
✿ 需要掌握的编译器知识 ★ 编译器为eclipse为例子 调试准备工作(步骤:Window -> Show View ->...): □ 打开调试断点Breakpoint: □ 打开变量 ...
- 教你阅读 Cpython 的源码(二)
第二部分:Python解释器进程 在上节教你阅读 Cpython 的源码(一)中,我们从编写Python到执行代码的过程中看到Python语法和其内存管理机制. 在本节,我们将从代码层面去讨论 ,Py ...
- (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路
[声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...
- daily news新闻阅读客户端应用源码(兼容iPhone和iPad)
daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...
- mybatis generator 源码学习
mybatis/generator 源码地址mybatis/parent 源码地址1. 分别点击Download ZIP下载到本地. 2. 解压generator-master.zip中的core到g ...
- 如何阅读Android系统源码-收藏必备
对于任何一个对Android开发感兴趣的人而言,对于android系统的学习必不可少.而学习系统最佳的方法就如linus所言:"RTFSC"(Read The Fucking So ...
- 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解
原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...
- 通用查询实现方案(可用于DDD)[附源码] -- 设计思路
原文:通用查询实现方案(可用于DDD)[附源码] -- 设计思路 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html). ...
- android新闻项目、饮食助手、下拉刷新、自定义View进度条、ReactNative阅读器等源码
Android精选源码 Android仿照36Kr官方新闻项目课程源码 一个优雅美观的下拉刷新布局,众多样式可选 安卓版本的VegaScroll滚动布局 android物流详情的弹框 健身饮食记录助手 ...
随机推荐
- centos7安装使用vagrant
https://blog.51cto.com/u_12173069/2312621 #download virtualbox https://www.virtualbox.org/wiki/Linux ...
- spring cloud --- Zuul --- 心得
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 什么是 Zuul? Zuul是微服务网关,与Gateway类似 ,根据请 ...
- Centos7 文件权限理解(持续更新)
后期排版,边学边记边敲 用户详情分析 管理员用户 root 0 虚拟用户 nobody 1-999 普通用户 test001 1000+ 输入ll命令查看当前目录文件详情 根据这张图片可知,目录 ...
- GORM学习指南
orm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. 一.初识Gorm Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...
- 论文翻译:2020_Nonlinear Residual Echo Suppression using a Recurrent Neural Network
论文地址:https://indico2.conference4me.psnc.pl/event/35/contributions/3367/attachments/779/817/Thu-1-10- ...
- 超详细的编码实战,让你的springboot应用识别图片中的行人、汽车、狗子、喵星人(JavaCV+YOLO4)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- leetcode 645. 错误的集合
问题描述 集合 S 包含从1到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复. 给定一个数组 nums 代表 ...
- 【C++】指针和函数
指针和函数 标签:c++ 目录 指针和函数 一.基本概念 定义: 指针的定义及使用: 二.指针的相互赋值 三.指针的运算 比较大小: 相减: 加减整数类型变量或者常量: 自增自减: 下标运算符[ ]: ...
- 【记录一个问题】thanos receiver的日志中出现错误:conflict
完整的错误如下: level=debug ts=2021-08-16T09:07:43.412451Z caller=handler.go:355 component=receive componen ...
- 【转载】ASP.NET前台代码绑定
ASP.NET前台代码绑定后台变量方法总结http://www.cnblogs.com/lerit/archive/2010/10/22/1858007.html ASP.NET前台无法访问后台int ...