PPT
演讲文稿:
可以参考右下脚的页脚进行文案说明:
开场(第1,2页PPT):
大家好,我是小诚信驿站,原因是来自大学创业的奶茶店,曾经大家倡导诚信,而我的愿望也是“晓成”相信这个诚信驿站。大家可以看下我的业务经验,工作经历会发现哇,这个人好杂,工作经历很多啊,实际上我工作仅5年。如果大家喜欢我的分享,我下次成长,普通二本学历如何跨专业曲线进大厂。
今天分享的主题是:聊聊MyBatis源码。因为做技术的经常会遇到面试问框架和源码,工作中处理问题需要debug源码,所以希望大家能有收获。
(第3页PPT):
分享的内容会分为如下几个模块:
- 简介
- 核心架构原理图
- 案例讲解-初始化篇
- 案例讲解-执行篇
- MyBatis中的设计模式case
- 小结
(第4页PPT):
期望你能获得的收获:
- 如何阅读源码
- 阅读源码的准备
- MyBatis源码逻辑架构原理
- MyBatis核心加载执行交互原理
- 开源框架中的设计模式
(第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封装了事务操作/更新操作/删除操作等。
没错,设计模式,好的框架一般都会设计的时候集成了多种设计模式。
Builder模式的定义是“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”
此模式主要用于将复杂对象的构造过程与其表示分离。它将复杂对象的创建过程划分为简单的步骤,并屏蔽复杂对象内部的特定构造细节.
(第14页PPT):
而我们看下MyBatis框架是怎么帮我们做的呢?看下图
(第15页PPT):
小结下,我们将我们学到的初始化过程 执行化过程集合成了一张图,大家可以收藏下。