mybatis核心流程三大阶段

Mybatis的初始化  建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

Product:要创建的复杂对象

Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建;

ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例;

Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;

建造者模式 使用场景

  ·需要生成的对象具有复杂的内部结构,实例化对象时要屏蔽掉对象内部的细节,让上层代码与复杂对象的实例化过程解耦,可以使用建造者模式;简而言之,如果“遇到多个构造器参数时要考虑用构建器”;

  ·对象的实例化是依赖各个组件的产生以及装配顺序,关注的是一步一步地组装出目标对象,可以使用建造器模式;

建造者模式与工厂模式之间的区别:

Mybatis的初始化

MyBatis建造者类图

映射器的关键类

Configuration : Mybatis启动初始化的核心就是将所有xml配置文件信息加载到Configuration对象中, Configuration是单例的,生命周期是应用级的;

MapperRegistry:mapper接口动态代理工厂类的注册中心。在MyBatis中,通过mapperProxy实现InvocationHandler接口,MapperProxyFactory用于生成动态代理的实例对象;

ResultMap:用于解析mapper.xml文件中的resultMap节点,使用ResultMapping来封装id,result等子元素;

MappedStatement:用于存储mapper.xml文件中的select、insert、update和delete节点,同时还包含了这些节点的很多重要属性;

SqlSource:mapper.xml文件中的sql语句会被解析成SqlSource对象,经过解析SqlSource包含的语句最终仅仅包含?占位符,可以直接提交给数据库执行;

configuration类图解

ResultMap图解

mappedStatment图解

MyBatis初始化过程

代理阶段

binding模块分析

MapperRegistry : mapper接口和对应的代理对象工厂的注册中心;

MapperProxyFactory:用于生成mapper接口动态代理的实例对象;

MapperProxy:实现了InvocationHandler接口,它是增强mapper接口的实现;

MapperMethod:封装了Mapper接口中对应方法的信息,以及对应的sql语句的信息;它是mapper接口与映射配置文件中sql语句的桥梁;

从XMLMapperBuilder.bindMapperForNamespace()开始入手

解读MapperMethod

MapperMethod:封装了Mapper接口中对应方法的信息,以及对应的sql语句的信息;它是mapper接口与映射配置文件中sql语句的桥梁;MapperMethod对象不记录任何状态信息,所以它可以在多个代理对象之间共享;

   SqlCommand : 从configuration中获取方法的命名空间.方法名以及SQL语句的类型;

   MethodSignature:封装mapper接口方法的相关信息(入参,返回类型);

   ParamNameResolver: 解析mapper接口方法中的入参;

翻译过程

sqlsession相关的类

创建SqlSession 策略模式

策略模式(Strategy Pattern)策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。

Context:算法调用者,使用setStrategy方法灵活的选择策略(strategy);

Strategy:算法的统一接口;

ConcreteStrategy:算法的具体实现;

策略模式的使用场景:

  针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;

  出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。

SqlSession相关类UML

SqlSession是MyBaits对外提供的最关键的核心接口,通过它可以执行数据库读写命令、获取映射器、管理事务等;

SqlSession查询接口嵌套关系

核心组件executor

Executor组件分析

Executor是MyBaits核心接口之一,定义了数据库操作最基本的方法,SqlSession的功能都是基于它来实现的;

模板模式

模板模式(Template Pattern):一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定实现;

BaseExecutor代码分析 模板模式应用场景

BaseExecutor:抽象类,实现了executor接口的大部分方法,主要提供了缓存管理和事务管理的能力,其他子类需要实现的抽象方法为:doUpdate,doQuery等方法;

遇到由一系列步骤构成的过程需要执行,这个过程从高层次上看是相同的,但是有些步骤的实现可能不同,这个时候就需要考虑用模板模式了。比如:Executor查询操作流程:

Executor的三个实现类解读

  SimpleExecutor:默认配置,使用PrepareStatement对象访问数据库,每次访问都要创建新的PrepareStatement对象;

  ReuseExecutor:使用预编译PrepareStatement对象访问数据库,访问时,会重用缓存中的statement对象;

  BatchExecutor:实现批量执行多条SQL语句的能力;

Executor的三个重要小弟

通过对SimpleExecutor doQuery()方法的解读发现,Executor是个指挥官,它在调度三个小弟工作:

  StatementHandler:它的作用是使用数据库的Statement或PrepareStatement执行操作,启承上启下作用;

  ParameterHandler:对预编译的SQL语句进行参数设置,SQL语句中的的占位符“?”都对应BoundSql.parameterMappings集合中的一个元素,在该对象中记录了对应的参数名称以及该参数的相关属性

  ResultSetHandler:对数据库返回的结果集(ResultSet)进行封装,返回用户指定的实体类型;

Executor内部运作过程

StatementHandler分析

StatementHandler完成Mybatis最核心的工作,也是Executor实现的基础;功能包括:创建statement对象,为sql语句绑定参数,执行增删改查等SQL语句、将结果映射集进行转化;

BaseStatementHandler:所有子类的抽象父类,定义了初始化statement的操作顺序,由子类实现具体的实例化不同的statement(模板模式);

RoutingStatementHandler:Excutor组件真正实例化的子类,使用静态代理模式,根据上下文决定创建哪个具体实体类;

SimpleStatmentHandler :使用statement对象访问数据库,无须参数化;

PreparedStatmentHandler :使用预编译PrepareStatement对象访问数据库;

CallableStatmentHandler :调用存储过程;

ResultSetHandler分析

ResultSetHandler将从数据库查询得到的结果按照映射配置文件的映射规则,映射成相应的结果集对象;

转载于:https://www.cnblogs.com/Soy-technology/p/11462673.html

MyBatis源码流程分析相关推荐

  1. MyBatis源码骨架分析

    源码包分析 MyBatis 源码下载地址:https://github.com/MyBatis/MyBatis-3 MyBatis源码导入过程: 下载MyBatis的源码 检查maven的版本,必须是 ...

  2. android 虚拟按键源码流程分析

    android 虚拟按键流程分析 今天来说说android 的虚拟按键的源码流程.大家都知道,android 系统的状态栏,虚拟按键,下拉菜单,以及通知显示,keyguard 锁屏都是在framewo ...

  3. MyBatis源码简单分析

    准备工作 Mybatis官网地址:https://blog.mybatis.org/ MyBatis官方文档地址:https://mybatis.org/mybatis-3/ MyBatis源码下载地 ...

  4. 技术宝典 | WebRTC ADM 源码流程分析

    导读: 本文主要基于 WebRTC release-72 源码及云信音视频团队积累的相关经验而成,主要分析以下问题: ADM(Audio Device Manager)的架构如何?ADM(Audio ...

  5. WebRTC ADM 源码流程分析

    导读: 本文主要基于 WebRTC release-72 源码及云信音视频团队积累的相关经验而成,主要分析以下问题: ADM(Audio Device Manager)的架构如何?ADM(Audio ...

  6. springcloud ribbon @LoadBalance负载均衡源码流程分析

    一.编写示例 1.服务端 pom.xml <properties><java.version>1.8</java.version><spring-cloud. ...

  7. AQS 源码流程分析

    导读: 我们日常开发中,经常会碰到并发的场景,在 Java 中语言体系里,我们会想到 ReentrantLock.CountDownLatch.Semaphore 等工具,但你是否清楚它们内部的实现原 ...

  8. Android 9.0系统恢复出场设置源码流程分析

    前言 作为Framework层的开发人员,如果我们想让系统恢复出厂设置,一般有一下三种方式: 1.在[系统设置页面]进入[恢复出厂设置页面],点击[恢复出厂设置]按钮. 2.直接通过adb发送恢复出厂 ...

  9. Fabric源码流程分析之Orderer篇

    导言: 本文使用fabric1.1版本,此时有小朋友会问了,fabric都出1.4.2了你怎么还在看1.1呢!首先fabric自1.0以后大的架构基本没有变化,小版本升级只是功能性上更加丰满了,当然最 ...

最新文章

  1. 在“内卷”、“红海”的2020 年,开垦计算机视觉领域的知识荒原:BatchNorm
  2. VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug
  3. 会计有必要学python吗-工作三年却被实习生抢了饭碗,学会Python到底有多吃香?...
  4. linux 修改时间的命令,Linux 常用命令(查看版本、修改系统时间)
  5. Netflix如何节省92%视频编码成本?
  6. 梯度下降法_梯度下降
  7. Codeforces 1188A 构造
  8. jquery日期时间控件
  9. 世界卫生组织高血压防治指南_建立对团队和组织的信任的指南
  10. javascript图片隐写术,感觉可以用它来干点有想法的事情
  11. junit搭配hamcrest使用
  12. 错误解决:src/cpp/cuda.hpp:  fatal error: cuda.h
  13. Cron定时任务应用到Thinkphp – 贤生博客
  14. 音频传输中的I2S协议
  15. Java下载安装及环境配置
  16. 无需格式化 移动硬盘/U盘上装WinPE、Win7PE图解
  17. 什么是搜索引擎?有什么作用?
  18. 服务端通过AWS SNS创建消息推送记录
  19. 【论文阅读笔记】用于真实图像超分辨率的一种局部判别学习方法(LDL)
  20. 苹果新款笔记本_苹果自研CPU最快下月杀到 搭配史上最便宜Mac笔记本(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...

热门文章

  1. 转:js-sdk探索之微信网页分享
  2. 对一个伪装成微信的加固病毒的分析
  3. Individual Project-——word_frequency——final requirement
  4. 【转】c#委托与事件
  5. visual studio 工具箱(选项卡、无控件、灰图标)
  6. java播放器使用教程_java 实现音乐播放器的简单实例
  7. django部署iiswin10_基于Windows平台的Django在本地部署和腾讯云服务器上部署的方法教程(一)...
  8. 3d相册 html 代码_HTML5 3D立体图片相册
  9. idea中链接mysql查询_在Idea中编写Java程序连接查询Sqlite数据库
  10. mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法