通俗易懂的Mybatis工作原理[通俗易懂]

作为半自动的ORM框架,Mybatis被越来越多的企业接受。搞清楚它的工作原理以及底层实现,对于开发者可事半功倍。很多文章都是使用大批量的源码流程去分析原理。对于有源码阅读功底的开发者,也许还能招架住,但还是不直观。我以前的很多文章都是这么做的,后来有朋友私信建议说,这些文章类似于个人笔记,只能自己阅读,不利于分享,所以,本文将尝试采用通俗易懂的白话文带领大家认识一下Mybatis的工作原理。(PS:大家可以设想,如果自己在开发Mybatis,该如何设计好Mybatis的功能呢?)一...

大家好,又见面了,我是你们的朋友全栈君。

作为半自动的ORM框架,Mybatis被越来越多的企业接受。搞清楚它的工作原理以及底层实现,对于开发者可事半功倍。

很多文章都是使用大批量的源码流程去分析原理。对于有源码阅读功底的开发者,也许还能招架住,但还是不直观。我以前的很多文章都是这么做的,后来有朋友私信建议说,这些文章类似于个人笔记,只能自己阅读,不利于分享,所以,本文将尝试采用通俗易懂的白话文带领大家认识一下Mybatis的工作原理。

(PS:大家可以设想,如果自己在开发Mybatis,该如何设计好Mybatis的功能呢?)

 

一.配置文件

Mybatis作为第三方的框架,想要集成至Java项目,必须要对其配置文件进行配置。

Mybatis配置文件中需要配置数据源、settings以及mappers等信息。

数据源用来连接数据库,settings是一些常用配置,而mappers则指定我们mapper接口的扫描范围。

 

二.读取配置文件

写好配置文件后,自然要把它通过IO读取至jvm内存中使用,所以Mybatis自定义了一个Reader的输入流,通过配置文件路径,加载配置至虚拟机内存。

 

三.解析配置文件

有了配置文件的流,我们开始动手解析它,Mybatis提供了一个SqlSessionFactoryBuilder解析配置(好名字不怕长),其内部本质上是一个XMLConfigBuilder的XML解析器(Mybatis配置文件一般都是XML格式),这个解析器会把配置文件读取,封装成Configuration对象(Mybatis的核心对象),Configuration对象中的属性(settings/mappers等)对应配置文件中的标签。

这里面有很多操作,比如mappers属性,本质上是一个HashMap,存放配置文件中mappers的扫包范围/classpath对应的Mapper类,key为Mapper类的class类型,value为MapperProxyFactory(mapper的代理工厂,后面会解释此处)。

同时Mybatis还会依照Mapper.java中接口的方法和Mapper.xml的sql标签命名空间做绑定,形成MapperedStatmenet对象。这就是我们为什么写一个接口可以直接映射到sql中。

配置文件解析好后,会创建一个DefaultSqlSessionFactory对象,并传入Configuration。

 

四.开启会话

将配置文件解析,并将所有相关的组件都准备好后,就要开启本次会话session了。DefaultSqlSessionFactory通过openSession的方式创建DefaultSqlSession,

并且开启事务,创建sql的执行器。将这些对象,包括Configuration全部传入DefaultSqlSession。

 

五.获取通讯的Mapper

程序调用Mybatis是通过它的mapper。但是Mapper.java都是一些接口,接口不能实例化,那么Mybatis底层怎么做呢?

当然是代理技术,Mybatis采用JDK动态代理帮我们生成了Mapper接口的代理类。

当我们从通过sqlSession.getMapper(Mapper.class)的方式去获取mapper对象时,底层其实是从sqlSession的属性Configuration中的mapper注册中心(上文的HashMap)寻找到对应的代理工厂,然后通过MapperProxy的代理生成对应的代理对象。

 

六.执行查询

以查询为例,mapper代理对象执行查询时,依照JDK动态代理原理,对进入到MapperProxy的invoke方法进行处理,这里面本质上拿到查询方法的名称,获取对应的MapperedStatment对象,然后执行SqlSession的查询。

sqlSession的查询,会先获取MapperedStatment中sql的信息,分页信息,本次请求方法名称,参数,数据源等数据,将这些维度生成一个缓存key,然后进行它著名的多级缓存处理。

 

七.多级缓存

多级缓存概念就是前一级缓存有数据,则直接返回。

Mybatis维护了二级缓存。当开启二级缓存时,Mybatis启动后维护一个TranscationCacheManger去向二级物理介质缓存中拿到所有缓存数据。

TranscationCacheManger内部维护一个Map<Cache,TransactionCache>,key为二级缓存物理介质类型,value为该缓存介质对应的缓存数据。

TransactionCache也维护了一个Map<String,Object>,key为上文提到的缓存key,value为当前缓存的结果集。

当Mybatis查询时,拿到MapperedStatment的sql标签上cache的类型,去TranscationCacheManger查找,进而根据key匹配是否有缓存。

如果二级缓存查不到,则进入下游查询(一级缓存/DB),如果下游返回数据,则将本次查询记录至map中,并且维护一个set存放未命中的key,sqlSession关闭后,会将未命中的数据刷新至二级物理介质中。

一级缓存本质上就是一个HashMap,key就是缓存key,value就是缓存结果。

如果一级也没有,就会查询DB,之后就是JDBC的封装了。

所以可以看出Mybatis的一级缓存存在的问题很多都是来源于hashMap。

 

八.流程图

通俗易懂的Mybatis工作原理[通俗易懂]

欢迎大家和帝都的雁积极互动,头脑交流会比个人埋头苦学更有效!共勉!

公众号:帝都的雁

通俗易懂的Mybatis工作原理[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126538.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pytest 执行用例_测试用例一般执行多少次

    pytest 执行用例_测试用例一般执行多少次前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年7月30日
    6
  • Java web实现video播放

    Java web实现video播放javaweb实现video播放1.前端的实现通过getQueryVariable获取url的参数(vid)functiongetQueryVariable(variable){varquery=window.location.search.substring(1);varvars=query.split(“&”);for(v…

    2022年7月7日
    64
  • php redis缓存雪崩,redis雪崩是什么「建议收藏」

    php redis缓存雪崩,redis雪崩是什么「建议收藏」什么是redis的雪崩?下面本篇文章就来给大家简单介绍一下,希望对你们有所帮助。什么是雪崩?因为缓存层承载了大量的请求,有效的保护了存储层,但是如果缓存由于某些原因,整体不能够提供服务,于是所有的请求,就会到达存储层,存储层的调用量就会暴增,造成存储层也会挂掉的情况。缓存雪崩的英文解释是奔逃的野牛,指的是缓存层当掉之后,并发流量会像奔腾的野牛一样,大量访问后端存储。缓存雪崩通俗简单的理解就是:由于…

    2022年9月14日
    4
  • Postgresql+Springboot yml基本使用[通俗易懂]

    Postgresql+Springboot yml基本使用[通俗易懂]一、Postgresql介绍PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函

    2025年7月14日
    2
  • 200行Html5+CSS3+JS代码实现动态圣诞树

    200行Html5+CSS3+JS代码实现动态圣诞树一、前言最近CSDN的热榜出现了很多用Python、C/C++等编程语言实现的圣诞树,这篇文章用前端三大杀手Html5、CSS、Js来实现动态圣诞树二、

    2022年7月25日
    13
  • Linux安装Redis(图文解说详细版)「建议收藏」

    Linux安装Redis(图文解说详细版)「建议收藏」最近开个新坑,就是在linux环境中操作开发环境,带大家玩转Linux,会整理出一篇Linux的专栏,欢迎大家订阅!!富贵同学linux环境为CentOS7.8版本。这次说一下Redis的安装第一步,下载安装包https://redis.io/download第二步,上传安装包到/opt下(老规矩了,安装包在opt下)第三步,解压安装包tar-zxvfredis-6.2.6.tar.gz第四步,编译进入到reidis-6.2.6中输入make进行编译第五步,安装进入s

    2022年6月20日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号