1.通过类加载器,加载了config.xml文件

2.通过SqlSessionFactoryBuilder.build(resource)这个方法进行了config.xml的解析,解析为Configuration对象-------代码如下
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return this.build(parser.parse());----parser.parse()这里返回的是一个Configuration对象----在parse方法中,实现了以下方法

3.this.parseConfiguration(this.parser.evalNode("/configuration"));
在parseConfiguration方法中,进行具体的标签属性解析为对象,包括了对mappers的解析,具体方法名为mapperElement,在这方法中,加载了Mapper文件,以及对mapper中的属性进行了解析,解析为MapperStatement对象,并且把一个一个的MapperStatement对象加进了Configuration中,configuration.addMappedStatement(statement);最后返回一个Configuration对象

4.在最后,最后一个功能:构建了一个DefaultSqlSessionFactory
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}

5.方法sqlSessionFactory.openSession();实际执行的是DefaultSqlSessionFactory
方法,因为第四步已经给我们new出来了,在DefaultSqlSessionFactory中调用openSession方法,在openSession方法中又调用了
this.openSessionFromDataSource这个方法,在这个方法中创建了executor方法等,还new了一个DefaultSqlSession方法====new DefaultSqlSession(this.configuration, executor, autoCommit);这就是sqlsession的实现类,最后得到了sqlSession对象(执行增删改查等功能)

6.Sqlsession.getMapper("User.dao")

7.在DefaultSqlSession中调用getMapper();

8.在configuration中调用getMapper();

9.在mapperRegistry中调用getMapper();并且调用mapperProxyFactory.newInstance(sqlSession);

10.在MapperProxyFactory中首先调用newInstance(Sqlsession),在调用newInstance(mapperProxy)并创建代理Proxy.newProxyInstance(加载器,接口,MapperProxy)

11.在MapperProxy中负责实现了InvocationHandler的具体功能

12.return代理对象mapper给我们,接着使用mapper调用具体的方法

13.因为在MapperProxy中调用MapperMethod方法,此方法首先通过SqlCommand获取namespace.id以及方法的类型,通过MethodSignature处理返回值和参数。并调用MapperMethod方法中execute的方法,在方法中根据相应的方法类型(switch case),直接调用sqlSession.update等方法,完成了与Sqlsession建立连接

14.因为sqlsession是接口,所在在它的实现类DefaultSqlSession中调用update方法,并在update方法中执行executor.update

15.跳转到SimpleExecutor执行doUpdate方法,并在其中new一个StatementHandler,使用Statementhandler在调用update方法-----handler.update(stmt);

16.因为StatementHandler是接口类型,所以跳转到它的实现类SimpleStatementHandler中,在这儿执行SimpleStatementHandler.update();在updata方法中执行了statement.execute(sql);这就是最后执行sql语句的位置,这其中就是jdbc的底层statement。

Mybatis底层源码执行流程的更多相关文章

  1. Python 多线程、多进程 (一)之 源码执行流程、GIL

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  2. mybatis源码专题(2)--------一起来看下使用mybatis框架的insert语句的源码执行流程吧

    本文是作者原创,版权归作者所有.若要转载,请注明出处.本文以简单的insert语句为例 1.mybatis的底层是jdbc操作,我们先来回顾一下insert语句的执行流程,如下 执行完后,我们看下数据 ...

  3. (3)一起来看下使用mybatis框架的select语句的源码执行流程吧

    本文是作者原创,版权归作者所有.若要转载,请注明出处.本文以简单的select语句为例,只贴我觉得比较重要的源码,其他不重要非关键的就不贴了 主流程和insert语句差不多,这里主要讲不同的流程,前面 ...

  4. 深入Mybatis源码——执行流程

    前言 上一篇分析Mybatis是如何加载解析XML文件的,本篇紧接上文,分析Mybatis的剩余两个阶段:代理封装和SQL执行. 正文 代理封装 Mybatis有两种方式调用Mapper接口: pri ...

  5. java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(上)源码执行流程

    做过web项目的小伙伴,对于SpringMVC,Struts2都是在熟悉不过了,再就是我们比较古老的servlet,我们先来复习一下我们的servlet生命周期. servlet生命周期 1)初始化阶 ...

  6. mybatis底层源码分析之--配置文件读取和解析

    现在企业级开发中ssm是很常见的技术标配,mybatis比hibernate轻量了很多,而且学习成本相对较低,简单易上手. 那么,问题来了,简单好用的mybatis底层到底是如何实现的呢?都使用了什么 ...

  7. Mybatis底层源码分析

    MyBatis 流程图 Configuration.xml 该配置文件是 MyBatis 的全局配置文件,在这个文件中可以配置诸多项目.常用的内容是别名设置,拦截器设置等. Properties(属性 ...

  8. 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...

  9. 从底层源码浅析Mybatis的SqlSessionFactory初始化过程

    目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...

随机推荐

  1. image cache service

    image cache service 图床 https://images.weserv.nl/ https://github.com/weserv/images meta & referre ...

  2. WebAR in Action

    WebAR in Action WebAR (Web + AR) 增强现实 https://developer.mozilla.org/en-US/docs/Web/API/WebAR_API Web ...

  3. 中文域名 & 原理剖析

    中文域名 & 原理剖析 https://zh.wikipedia.org/wiki/中文域名 原理 利用浏览器的对字符编码的转换算法,实现 unicode 字符显示! 国际化域名: 就是一个普 ...

  4. ffmpeg concat设置绝对路径

    https://superuser.com/questions/718027/ffmpeg-concat-doesnt-work-with-absolute-path/1551017#1551017 ...

  5. VOR/DME程序进近、复飞保护区的绘制

    今天尝试画一个典型的VOR/DME进近程序保护区. 读图 某机场VOR/DME进近程序平面图部分如下图所示:   该程序剖面图部分如下图所示:   分析 该机场采用了偏置导航台布局(导航台在机场内), ...

  6. 记一个关于std::unordered_map并发访问的BUG

    前言 刷题刷得头疼,水篇blog.这个BUG是我大约一个月前,在做15445实现lock_manager的时候遇到的一个很恶劣但很愚蠢的BUG,排查 + 摸鱼大概花了我三天的时间,根本原因是我在使用s ...

  7. oracle之用户

    命令都是在命令行窗口执行 创建用户 1)登陆管理员用户 sqlplus system/密码 sqlplus system/briup 注意不要以分号结尾 2)创建用户 create user 用户名 ...

  8. Ajax的基本用法

    1.介绍 2.基本用法 2.1原生写法 $.ajax({ url: url, //是否是异步请求,默认是 // async: false, //请求方式,默认是get //type:'get', // ...

  9. java算法题

    1.下面输出结果是什么? public class Test { public static void main(String[] args) { Person person=new Person(& ...

  10. Java基础语法:基本数据类型

    Java是一种强类型语言,每个变量都必须声明其类型. Java的数据类型 分为两大类:基本类型(primitive type)和引用类型(reference type). Java的所有八种基本类型的 ...