十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第1张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

前言

MyBatis是一个优秀的持久层ORM框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过xml或注解的方式将要执行的statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

为什么要掌握MyBatis?

Mybatis之所以流行的一个原因是上手快,当学完JDBC之后,再去学习Mybatis,上手时间要比Hibernate快。一个技术学习成本低,也是一个优势,毕竟企业招人是让员工帮他写代码的,基本不会给出太多时间让员工去学习(资本家)。

另外一个原因就是sql优化上了,业务复杂的sql语句通常需要进行优化,此时操作Mybatis更加容易一些。

现在spring boot和Mybatis plus的出现,使Mybatis使用起来更加简单了。

所以在大多数场景里,MyBatis更适合。

为什么现在面试都要问源码?

因为这能体现一个面试者是否爱钻研,是否愿意深入原理。而企业需要的恰恰是这样的人!

而且看源码我觉得有以下好处:

1)可以从源码中学习比如我们看JDK的源码,其中会有很多关于性能优化、防并发的例子,还有很多地方用了设计模式,这些都是很好的可以用来学习的代码。对于初学者来说,很多代码格式、命名等都是需要学习的,最好的办法就是通过开源代码来学习。

2)深入源码才能懂得原理有的时候,我们使用的第三方的框架,中间件等,我们要想了解他们的原理,最有效的办法就是直接看源码。源码是不会骗人的。

3)更好的解决问题只要是人写的代码,就可能存在bug,别人的开源代码也一样,通过阅读源代码可以更好的定位和解决问题。

4)为了找工作

十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第2张图片
mybatis源码思维脑图

大厂都在用MyBatis,跳槽的时候MyBatis更是面试必问的内容,那你对于MyBatis又掌握了多少呢?

下面这5道阿里关于MyBatis的面试题,你能答上来几道?

  1. 源码中用了哪些设计模式?为什么要用这些设计模式?
  2. MyBatis打开调试模式之后,能打印sql语句等信息,这是怎么实现的?实现过程中使用了什么设计模式?
  3. MyBatis是如何为二级缓存动态添加日志、同步控制、阻塞、缓存淘汰策略等附加能力的?用了什么设计模式?
  4. 请描述从数据库连接池获取一个数据连接的过程;
  5. 什么是缓存雪崩?如何解决?

怎么才能更好地掌握MyBatis

市面上真正适合学习的MyBatis资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃。学透MyBatis源码难道就真的就没有一种适合大多数同学的方法吗?在这分享一个MyBatis源码学习文档,这份文档从MyBatis源码的角度分析Mapper绑定过程、SqlSession操作数据库原理、插件实现原理等。

这是一份完整的《Mybatis源码分析.PDF》文档,请看完下面的章节的简单介绍,有需要可以点击这里获取文档。

第一部分:MyBatis的使用

第一部分介绍了MyBatis的一些背景知识,并比较了JDBC、SpringJDBC、Hibernate和 MyBatis

等 4 种持久层技术的优缺点,以及各自的使用场景。最后演示了单独使用 MyBatis,和在

Spring 中使用 MyBatis 等两种不同的方式。总的来说,内容应该较为充分的解答了

MyBatis 是什么,为何要使用,以及如何使用这三个问题。

  • MyBatis是什么
  • 为什么要使用MyBatis
  • 如何使用MyBatis
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第3张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

第二部分:配置文件解析过程

我们在使用 MyBatis 框架时,通常会进行一定的设置,使其能更好的满足我们的需求。对于一个框架来说,提供较为丰富的配置文件,也是其灵活性的体现。这部分将会介绍 MyBatis 配置文件中的大部分节点解析过程,包含但不限于 properties、settings、typeAliase、typeHandlers 等。

  • 解析节点
  • 解析节点
  • 设置内容到 Configuration 中
  • 解析节点
  • 解析节点
  • 解析节点
  • 解析节点
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第4张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

第三部分:映射⽂件解析过程

这部分会分析一下映射文件解析的过程。与配置文件不同,映射文件用于配置 SQL语句,字段映射关系等。映射文件中包含等二级节点,这些节点将在接下来内容中进行分析。这部分除了分析常规的 XML 解析过程外,还会向大家介绍 Mapper 接口的绑定过程,以及其他一些知识。

  • 映射⽂件解析解析⼊口
  • 解析映射⽂件
  • Mapper 接⼜绑定过程分析
  • 处理未完成解析的节点
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第5张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

第四部分:SQL 执⾏流程

这部分将对 MyBatis 执行 SQL 的过程进行较为详尽的分析。该过程比较复杂,涉及的技术点很多。包括但不限于以下技术点:

  • 为 mapper 接口生成实现类
  • 根据配置信息生成 SQL,并将运行时参数设置到 SQL 中
  • 一二级缓存的实现
  • 插件机制
  • 数据库连接的获取与管理
  • 查询结果的处理,以及延迟加载等
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第6张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

第五部分:内置数据源

这部分将向大家介绍 MyBatis 内置数据源的实现逻辑。MyBatis 支持三种数据源配置,分别为 UNPOOLED、POOLED 和 JNDI。并提供了两种数据源实现,分别是UnpooledDataSource 和 PooledDataSource 。 在这三种数据源配置中, UNPOOLED 和 POOLED 是我们最常用的两种配置,这两种数据源也是本章要重点分析的对象。至于 JNDI,MyBatis 提供这种数据源的目的是为了让其能够运行在 EJB 或应用服务器等容器中,这一点官方文档中有所说明。

  • 内置数据源初始化过程
  • UnpooledDataSource
  • PooledDataSource
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第7张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

第六部分:缓存机制

在 MyBatis 中,Cache 是缓存接口,定义了一些基本的缓存操作,所有缓存类都应该实现该接口。 MyBatis 内部提供了丰富的缓存实现类,比如具有基本缓存功能的PerpetualCache ,具有 LRU 策略的缓存 LruCache ,以及可保证线程安全的缓存SynchronizedCache 和具备阻塞功能的缓存 BlockingCache 等。除此之外,还有很多缓存实现类,这里就不一一列举了。需要特别说明的是,MyBatis 在实现缓存模块的过程中,使用了装饰模式。在以上几种缓存实现类中, PerpetualCache 相当于装饰模式中的ConcreteComponent。LruCache、SynchronizedCache 和 BlockingCache 等相当于装饰模式中的 ConcreteDecorator。它们的关系如下:

十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第8张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

以上对 Cache 接口的实现类进行了简单的介绍,接下来,我们一起深入到源码中,看看这些缓存类的实现。

十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第9张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

第七部分:插件机制

一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。这样的好处是显而易见的,一是增加了框架的灵活性。二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作。以 MyBatis 为例,我们可基于 MyBatis 插件机制实现分页、分表,监控等功能。由于插件和业务无关,业务也无法感知插件的存在。因此可以无感植入插件,在无形中增强功能。

十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了_第10张图片
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了

当然还有搭配的视频教程,需要文档以及视频可转发+关注****有需要可以点击这里获取文档。

你可能感兴趣的:(十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了)