【技术创作101训练营】聊聊MyBatis源码

2023-09-02 20:00:16 浏览数 (2)

PPT

聊聊MyBatis源码.pptx

演讲文稿:

可以参考右下脚的页脚进行文案说明:

开场(第1,2页PPT):

大家好,我是小诚信驿站,原因是来自大学创业的奶茶店,曾经大家倡导诚信,而我的愿望也是“晓成”相信这个诚信驿站。大家可以看下我的业务经验,工作经历会发现哇,这个人好杂,工作经历很多啊,实际上我工作仅5年。如果大家喜欢我的分享,我下次成长,普通二本学历如何跨专业曲线进大厂。

今天分享的主题是:聊聊MyBatis源码。因为做技术的经常会遇到面试问框架和源码,工作中处理问题需要debug源码,所以希望大家能有收获。

(第3页PPT):

分享的内容会分为如下几个模块:

  • 简介
  • 核心架构原理图
  • 案例讲解-初始化篇
  • 案例讲解-执行篇
  • MyBatis中的设计模式case
  • 小结

(第4页PPT):

期望你能获得的收获:

  1. 如何阅读源码
  2. 阅读源码的准备
  3. MyBatis源码逻辑架构原理
  4. MyBatis核心加载执行交互原理
  5. 开源框架中的设计模式

(第5页PPT):

黑色是需要重点说明的,其他是作为根据时间可自动填充的文案,根据时间自己灵活把控。

简介

1.1、MyBatis是什么?

MyBatis 的前身是 iBatis,其是 Apache 软件基金会下的一个开源项目。2010年该项目从 Apache 基金会迁出,并改名为 MyBatis。同期,iBatis 停止维护。MyBatis 是一种半自动化的 Java 持久层框架(persistence framework),其通过注解或 XML 的方式将对象和 SQL 关联起来。之所以说它是半自动的,是因为和 Hibernate 等一些可自动生成 SQL 的 ORM(Object Relational Mapping) 框架相比而言,使用 MyBatis 需要用户自行维护 SQL。维护 SQL 的工作比较繁琐,但也有好处。比如我们可控制 SQL 逻辑,可对其进行优化,以提高效率。

1.2、为什么要用MyBatis?

技术之间通常没有高下之分,根据主流的市场会决定你的一些技术栈的选型。常用的ORM框架有Hibernate和MyBatis,也就是ssh组合和ssm组合中的h与m。

它们的特点和区别如下:

  • Hibernate对数据库结构提供了完整的封装,实现了POJO对象与数据库表之间的映射,能够自动生成并执行SQL语句。只要定义了POJO 到数据库表的映射关系,就可以通过Hibernate提供的方法完成数据库操作。
  • Hibernate符合JPA规范,就是Java持久层API。
  • MyBatis通过映射配置文件,将SQL所需的参数和返回的结果字段映射到指定对象,MyBatis不会自动生成SQL,需要自己定义SQL语句,不过更方便对SQL语句进行优化。

总结起来:Hibernate配置要比mybatis复杂的多,学习成本也比MyBatis高MyBatis,简单、高效、灵活,但是需要自己维护SQL;Hibernate功能强大、全自动、适配不同数据库,但是非常复杂,灵活性稍差。MyBatis 是一个容易上手的持久层框架,使用者通过简单的学习即可掌握其常用特性的用法。这也是 MyBatis 被广泛使用的一个原因。

1.3、为什么要看源码?

仁者见仁,智者见智。对于1-3年的工作人员可能更希望的是面试以及提升自己的认知和思想。对于3-5年工作者,或多或少如果想要挑战更高的角色,资深技术专家或者高级技术专家,会负责架构设计,业务模块设计,技术转型等,指导新人等,则需要对于技术有着深刻的理解。而源码如何设计的架构和思想就会帮助你提升很多,毕竟融入了非常多优秀的人的结晶智慧。

(第6页PPT):

1.4、如何阅读源码?

粗了解:对于开源框架的一些框架组成介绍,看看这个框架有几个模块,各个模块是做什么的,有什么联系,每个模块都有哪些核心类。可以看下书,或者找官网看下源码模块,这里我建议直接看源码踏实(书的版本会比源码的旧)。

踩点挖:对于某个模块的核心类,debug一遍,画出时序图,对于生命线有个了解,以及调用逻辑。

细整理:梳理涉及到的类图和时序图。

常分享:可以通过回顾知识,或者排查问题经常过一遍加深自己的理解和掌握。

(第7、8页PPT):

接下来进入正题:MyBatis核心架构拆解,第八页左侧是将源码包Mybatis进行了分层,右侧是对每个源码包的备注说明。

作为ORM框架,Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来的角色。Ibatis-Spring作为Spring框架和MyBatis框架的桥梁。或者直接使用Servlet JSP编写应用程序通过MyBatis框架的映射,让我们直接脱离JDBC直接链接数据库解放了生产力,提高了研发效率。

这里有个互动环节,大家能够将左侧和右侧的源码包对应起来么?如果可以的话 举手,或者打出你的答案,第一名可以领取技术书籍一份。

根据流程箭头我们可以看到整个数据流的节点状态。

MyBatis主要分为三层:

API层:

1、负责文件的执行IO流读取解析比如Configuration.xml,mapper.xml

2、负责业务代码暴露的SessionAPI,CRUD操作

3、负责@Mapper注解@Provider等

数据处理层:

1、负责外部XML的DOM对象解析

2、SQL的查找映射处理执行和返回

基础支撑层:

1、事务管理,缓存机制,日志管理,异常管理,插件管理

大体介绍完毕,我们来看下具体有没有案例来支撑下源码流程呢》答案是 不能让大家白来啊,接下来我们讲下案例初始化MyBatis都做了什么?

(第9页PPT):

一张完整的时序图操作流程,看起来好像做技术的一眼能看懂了,但是再看几眼放佛没有记住什么东西。因为框架源码一般封装的比较好,经常我们debug源码的时候,都会遇到很长的链路。

(第10页PPT):

那么这是我们想要的么?答案当然不是,有什么好的解决方案么?

(第11页PPT):

我们经常在使用MyBatis的过程中,会配置下XML文件或者利用注解的方式配置下扫描的包。没错,这就是SqlSessionFactoryBuilder会话工厂构建器读取的入参,通过字符流/字节流,然后如果配置了多数据源,构建出多个会话工厂,则可以根据每个会话工厂进行绑定数据源,执行过程中进行会话操作。

然后我们看了初始化MyBatis的逻辑,那么怎么执行呢?有知道的同学么?互动环节

(第12、13页PPT):

没错,XXX同学回答的很好,我们可以看图系统中的操作,我们统一理解是操作了一次会话,会话调用MyBatis提供的SessionAPI的时候其实原理是通过动态代理方式将会话委托给Session,从全局Configuration配置中获取Mapper的信息,然后进行CRUD操作,而JDBC被MyBatis封装了事务操作/更新操作/删除操作等。

讲了这么久了,大家对于MyBatis的流行从源码中看到了这些,还有别的么?互动环节

没错,设计模式,好的框架一般都会设计的时候集成了多种设计模式。

Builder模式的定义是“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”

此模式主要用于将复杂对象的构造过程与其表示分离。它将复杂对象的创建过程划分为简单的步骤,并屏蔽复杂对象内部的特定构造细节.

(第14页PPT):

而我们看下MyBatis框架是怎么帮我们做的呢?看下图

(第15页PPT):

小结下,我们将我们学到的初始化过程 执行化过程集合成了一张图,大家可以收藏下。

0 人点赞