Mybatis运行原理

Mybatis运行原理

先是简要的文字说明,后面放上图。如有叙述错误,感谢指正哈。

一、 根据配置文件创建SQLSessionFactory

首先将配置文件转化为流,创建SqlSessionFactoryBuilder对象,通过SqlSessionFactoryBuilder的build() 方法对流进行创建SQLSessionFactory的实例。

build() 的简易过程为:创建解析器parser对流进行配置文件中的每个标签进行解析,将解析后的结果保存在Configration中,最后通过build()返回一个DefaultSqlSession对象,即SQLSessionFactory的实例。

Mybatis运行原理

二、返回SqlSession的实现类DefaultSqlSession对象

在第一步获取到包含了Configration的DefaultSqlSession对象后,调用它的openSession() 方法,实际上是调用openSessionFromDataSource() 方法,在这个方法中获取环境信息,创建事务并使用newExecutor()获得executor对象。最后创建出包含Configration和executor的DefaultSqlSession对象。

newExecutor()的简易过程:首先根据全局配置创建出SimpleExecutor/ReuseExecutor/BatchExecutor中的一种(对executor进行包装)。然后如果开启了二级缓存则创建CachingExecutor(对executor进行包装)。最后使用每一种拦截器对executor进行包装并返回。

Mybatis运行原理

三、getMapper()返回接口的代理对象

SqlSession.getMapper()—>Configuration.getMapper()—>mapperRegistry.getMapper()。然后根据接口类型获得MapperProxyFactory。再通过mapperProxyFactory.newInstance(sqlSession)创建MapperProxy。而MapperProxy是实现了InvocationHandler接口,所以MapperProxy是一个代理对象。最后层层返回得到代理对象。

Mybatis运行原理

四、通过代理对象调用增删改查方法

这一步比较麻烦,简易说明一下:代理对象通过invoke()方法判断用户是用增删改查的哪个方法,然后再调用sqlSession的增删改查方法。

在调用sqlSession的增删改查方法中会调用executor对应的增删改查方法获取到BoundSql,BoundSql里包含了sql语句的详细信息。executor再创建StatementHandler,在创建StatementHandler的同时也创建了ParameterHandler与ResultSetHandler。StatementHandler通过ParameterHandler设置参数、通过ResultSetHandler处理结果。而ParameterHandler和ResultSetHandler都依赖于TypeHandler进行数据库类型和JavaBean类型的映射。TypeHandler的底层使用的是JDBC。

Mybatis运行原理

以上图片转载自尚硅谷

Original: https://www.cnblogs.com/xuzhuo123/p/15931191.html
Author: 在锻炼的新生代农民工
Title: Mybatis运行原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586612/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • docker安装

    本文的安装系统环境:centos7.5 1.如果系统默认安装旧版的docker,可以先删除 yum -y remove docker docker-common container…

    Java 2023年6月8日
    069
  • M1上安装OpenJDK8

    brew上还没有M1的JDK8,所以只能通过手动下载第三方的OpenJDK的方式,参考如下链接: https://dev.to/shane/configure-m1-mac-to-…

    Java 2023年5月30日
    069
  • git ignore忽略规则

    Git 忽略文件提交的方法 Git 忽略规则 Git 忽略规则优先级 Git 忽略规则匹配语法 常用匹配示例 多级目录忽略规则设置 .gitignore规则不生效 参考文章 Git…

    Java 2023年6月13日
    076
  • 集合笔记记录

    基础概念 Collection 是一个接口,定义了一些集合的通用方法(不做记录,自己查表)。在 Collection 中存放的是单列数据,即非 (key, value) 对形式的数…

    Java 2023年6月7日
    054
  • Stream.toList()和Collectors.toList()的性能比较

    昨天给大家介绍了Java 16中的Stream增强,可以直接通过toList()来转换成List。 主要涉及下面这几种转换方式: list.stream().toList(); l…

    Java 2023年6月9日
    077
  • 初识jdbc

    jdbc的概念,优势,和模拟jdbc 作用 连接数据库 与图形画界面的差别 功能与Navicat、SQLyog,一样都是用来操作数据库,但是jdbc是用编码来操作数据库,而Navi…

    Java 2023年6月5日
    066
  • 基于node、ganache搭建一个以太坊投票Dapp

    前言 这段时间在remix中学习solidity语法,虽然remix很强大,但是编写好的合约代码很容易丢失,虽然remix可以使用本地文件系统及github中的远程仓库,但还是想尝…

    Java 2023年6月8日
    085
  • String长度限制?

    String我们在开发和学习中会经常用到,但对String类型的取值范围我们并不明确。 String底层是char数组,并未标明长度限制。java中可以对数组指定长度,如果不指定就…

    Java 2023年6月5日
    079
  • Java 设计模式 – Observer 观察者模式

    说明都在注释: package ObserverModel; package ObserverModel; <span class="hljs-keyword&qu…

    Java 2023年6月9日
    048
  • VMware Workstation 15Pro 的安装与使用

    1,在VMware Workstation 15 Pro官网下载 2鼠标右键 以管理员身份运行 3,点击下一步 4,勾选[我接受许可协议中的条款],然后点击[下一步] 5点击[更改…

    Java 2023年6月7日
    080
  • Mac环境下RabbitMq安装与测试教程

    RabbitMq安装与测试教程 Installing on Mac I. 安装 123456789 brew install rabbitmq 启动控制台之前需要先开启插件 1 ….

    Java 2023年5月30日
    0112
  • Java8新特性之Stream–collect方法

    collect方法收集(collect)collect,收集,可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新…

    Java 2023年5月29日
    090
  • Linux系统(根目录下)目录介绍

    Linux系统(根目录下)目录介绍根目录(/)包含了几乎所的文件目录。相当于中央系统。进入的最简单方法是:cd /。★/boot 引导程序,内核等存放的目录这个目录,包括了在引导过…

    Java 2023年6月7日
    073
  • Springboot 链接Oracle 配置

    1.在配置文件中配置Oracle配置 spring.datasource.url=jdbc:oracle:thin:@ip:端口:XE spring.datasource.user…

    Java 2023年5月30日
    052
  • SpringBoot异步任务获取HttpServletRequest

    在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案…

    Java 2023年6月15日
    066
  • java基础-流程控制

    流程控制语句 if…else… while do…while…. switch case for foreach loop if&#…

    Java 2023年6月8日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球