1. 架构分层

    我们将MyBatis架构分为三层,分别为接口层、数据处理层和框架支撑层

    • 接口层:提供外部接口调用的API,使用端通过这些API来操作数据库,接口层收到请求后会调用数据处理层完成具体的数据处理

      使用端可以通过两种方式调用接口层:MyBatis提供的API、Mapper动态代理

    • 数据处理层:负责具体的SQL查找、解析、执行与执行结果映射处理,主要负责根据具体的请求完成数据库操作

    • 框架支撑层:负责基础的功能支撑,主要功能有连接管理、事务管理、配置加载和缓存管理

  2. 主要组件及关系

    组件 功能描述
    Configuration 接收使用端配置的MyBatis XML核心配置文件
    MappedStatement 接收使用端配置的XxMapper.xml文件
    SqlSession 负责与数据库交互的会话,主要封装了代理对象、增删改查、获取数据库连接
    Executor 执行器,MyBatis的核心调度器,主要负责动态语句的生成、事务管理及缓存操作
    StatementHandler 封装了诸多类,调度参数映射、SQL执行与结果集映射,主要负责 操作JDBC Statement对象执行SQL,
    ParameterHandler 负责将使用端传递的参数转换成JDBC Statement所需要的参数
    ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
    TypeHandler 主要负责JDBC对象与Java对象之间进行相互转换
    BoundSql 处理SQL中的#{} ${},进行替换处理,转换为数据库可执行的SQL
    RowBounds MyBatis提供的逻辑分页类,从结果集中进行过滤分页数据
  3. 执行流程

    1、读取Mybatis主配置文件信息

    2、获取SqlSessionFactory

    ​ a、使用XMLMappperBuilder解析Mybatis配置文件,封装成Environment对象,再把Environment对象设置给Configuration对象;

    ​ b.、调用ConfigurationElement函数,最终执行addMappedStatement方法,将mapper配置文件中的每一条SQL语句封装成mappedStatement对象,作为value保存在HashMap集合中;

    ​ c.、进入addLoaderResource方法,使用HashSet集合存放mybatis的mapper.xml 映射文件路径地址;

    ​ d.、进入bindMapperForNamespace()方法,通过namespace使用Java反射机制找到mapper接口,再调用addMapper()方法,判断是否是接口类型,是否注册过(注册过则抛出异常)其中mapperRegistry通过HashMap保存mapper接口,【key:接口;value:MapperProxyFactory】

    3、获取SqlSession对象

    ​ a、进入openSession()方法,执行newExecutor()方法创建执行器;

    ​ b、先创建 SimpleExecutor简单执行器,再判断是否开启了二级缓存,默认是开启的(使用时需要配置条件),就会去创建CacheExecutor缓存执行器

    ​ c、执行interceptorChain.pluginAll()方法,责任链设计模式,底层使用动态代理技术,使开发者可以自定义插件开发,只需要实现Interceptor接口,并指定想要拦截的方法签名即可,最后返回执行器;

    4、操作mapper接口

    ​ a、调用getMapper()方法,最终执行mapperProxyFactory.newInstance(sqlSession)方法创建代理类MapperProxy;

    ​ b、当我们调用mapper,getUser()方法的时候,就会去执行MapperProxy代理类的invoke()方法;

    ​ c、判断mapper接口是否有实现类,显然我们没有实现类,则调用cacheMapperMethod()方法去缓存中获取要代理的方法method;

    ​ d、进入cacheMapperMethod()方法先去查找缓存中有没有,没有的话将mapper配置文件中配置的SQL语句和对应的mapper接口方法进行关联并放入map缓存中,后期直接走缓存了,最后执行execute()方法;

    ​ e、执行execute()方法,最终调用selectOne()方法;

    ​ f、进入selectOne()方法,底层还是查询所有的,但是取第一个,查询多个的话会抛出异常;

    ​ g、进入selectList()方法,调用getMapperStatement()方法获取对应的SQL语句;

    ​ h、执行query()方法进行查询,判断如果开启了二级缓存并且配置了二级缓存存储介质(Redis,EhCache..)则先走二级缓存中查询数据,第一次查询是没有缓存数据的,则刷新缓存配置,清除缓存。

    ​ i、二级缓存(sessionFactory)中没有查询到数据,就回去执行BaseExecutor去查询 HashMap一级缓存中(sqlSession)是否有缓存数据,一级缓存(PerpetualCache)存放在内存中的,同理也是没有的,最后查询数据库DB

    ​ j、将从数据库查询出来的数据缓存到一级缓存中,再把一级缓存中的数据同步到二级缓存,添加到二级缓存之前先添加到getTransactionalCache的entritiesToAddOnCommit的map集合中临时缓存起来;

    ​ k、调用executor.close()方法循环迭代TransactionCache,最后将临时map缓存数据提交到二级缓存中,如果事务回滚,则会将缓存数据清除掉

    ​ l、再次查询的话,就有缓存了,会直接查询到缓存数据返回,不会去查询数据库DB

MyBatis(十一):MyBatis架构流程浅析的更多相关文章

  1. mybatis(十一)mybatis常见问题

    用注解还是用 xml 配置? 常用注解:@Insert.@Select.@Update.@Delete.@Param.@Results. @Result 在 MyBatis 的工程中,我们有两种配置 ...

  2. 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程

    MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十)--My ...

  4. MyBatis原理-架构流程

    一 .MyBatis原理架构图 Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体 ...

  5. Mybatis执行流程浅析(附深度文章推荐&面试题集锦)

    首先推荐一个简单的Mybatis原理视频教程,可以作为入门教程进行学习:点我 (该教程讲解的是如何手写简易版Mybatis) 执行流程的理解 理解Mybatis的简单流程后自己手写一个,可以解决百分之 ...

  6. mybatis(五)mybatis工作流程

    转载:https://www.cnblogs.com/wuzhenzhao/p/11103017.html 先来看一下MyBatis 的编程式使用的方法: public void testMapper ...

  7. 我们把Mybatis的功能架构分为三层:

    我们把Mybatis的功能架构分为三层: (1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理. (2) ...

  8. 基于spring和mybatis的简单项目流程

    Mybatis整合Spring配置 第一部分:配置Spring框架 配置SpringMVC的步骤 配置流程图 SpringMVC配置 导入包(基本包5个,1日志依赖包,2webmvc支持包) 构建一个 ...

  9. 【Mybatis】MyBatis之配置自定义数据源(十一)

    本例是在[Mybatis]MyBatis之配置多数据源(十)的基础上进行拓展,查看本例请先学习第十章 实现原理 1.扩展Spring的AbstractRoutingDataSource抽象类(该类充当 ...

随机推荐

  1. 1077E Thematic Contests 【二分答案】

    题目:戳这里 题意:n个数代表n个problem,每个数的值代表这个问题的topic,让我们挑出一些problems,满足挑出problems的topic是首项为a1公比为2的等比数列(每种topic ...

  2. python to exe

    使用pyinstaller 打包 文件结构如下 命令行cd 进入 project文件夹 ,然后 命令 pyinstaller -F main.py 即可打包文件为一个完整的exe.(不含DLL等)

  3. 2019牛客多校第一场I Points Division(DP)题解

    题意: n个点,分成两组A,B,如果点i在A中,那么贡献值\(a_i\),反之为\(b_i\). 现要求任意\(i \in A,j \in B\)不存在 \(x_i >= x_j\) 且 \(y ...

  4. ysoserial Commons Collections2反序列化研究

    Apache Commons Collections2反序列化研究 环境准备 JDK 1.7 Commons Collections 4.0 javassit 前置知识 PriorityQueue() ...

  5. 【原】无脑操作:Centos 7.6 + MariaDB + Rsyslog + LogAnalyzer环境搭建

    背景: 网络安全法第三章第二十一条明确规定"采取监测.记录网络运行状态.网络安全事件的技术措施,并按照规定留存相关的网络日志不少于六个月". 为了满足合规性的要求,应当建设相应的日 ...

  6. git branch All In One

    git branch All In One Git Branch Management https://git-scm.com/book/en/v2/Git-Branching-Branch-Mana ...

  7. 末日余晖 PC 版 下载

    末日余晖 PC 版 下载 <末日余晖>(英文名:Farlight 84)一款废土题材的射击游戏 Farlight 84 Official Trailer Farlight 84 官方预告片 ...

  8. yarn global add !== yarn add global

    yarn global add !== yarn add global yarn does not exist the --global flag, but exits yarn global com ...

  9. user tracker with ETag

    user tracker with ETag 用户追踪, without cookies clear cache bug 实现原理 HTTP cache hidden iframe 1px image ...

  10. expo-cli & React Native

    expo-cli https://reactnative.dev/docs/environment-setup You will only need a recent version of Node. ...