共计 3839 个字符,预计需要花费 10 分钟才能阅读完成。
关注“Java 后端技术全栈”
回复“面试”获取全套面试材料
很多人看源码都不晓得如何看,明天来教教大家如何看源码。
前提是咱们须要对整个 Mybatis
的原理、工作流程和模块进行一个整体的直通晓,另外还要有应用教训。
倡议先看这两篇文章:
本文次要内容:
源码下载
如何下载源码?
进入官网
https://mybatis.org/mybatis-3…
办法一
跳转到 github 上,咱们能够在 github 高低源码
https://github.com/mybatis/my…
下载源码
办法二
也能够通过
https://github.com/mybatis/my…
下载对应版本 jar 和源码:
下载到本地后,解压到本人的本地目录,而后应用 eclipse 或者 IDEA 导入。
发现 Mybatis 的包目录多大 20 个,上面咱们就来说说这些包的关系和对应的作用。
包分成三大类
根底性能包
这些包用来为其余包提供一些外围根底性能,如文件读取性能、反射操作性能等。这些包的特点是性能绝对独立,与业务逻辑耦合小。
上面就是根底性能相干的包目录:
配置解析包
这些包用来实现配置解析、存储等工作。这些包中的办法次要在零碎初始化阶段运行。
上面就是配置相干的包目录:
外围操作包
这些包用来实现数据库操作。在工作过程中,这些包可能会依赖根底性能包提供的根底性能和配置解析包提供的配置信息。这些包中的办法次要在数据库操作阶段运行。
外围解决层次要做了这四件事:
- 把接口中传入的参数解析并映射成 JDBC 类型;
- 解析 xml 文件中的 SQL 语句,包含插入参数和动静 SQL 的生成;
- 执行 SQL 语句;
- 处理结果集,并映射成 Java 对象。
留神:插件也属于核心层,这是由它的工作形式和拦挡的对象决定的。
上面就是核心层对应的包目录:
具体包介绍
reflection 包
Java 中的反射尽管功能强大,但对大多数开发人员来说,写出高质量的反射代码还是 有肯定难度的。
MyBatis 中专门提供了反射模块,该模块对 Java 原生的反射进行了良好的封装,提了更加简洁易用的 API,不便下层调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,进步了反射操作的性能。
Java 反射机制次要提供了以下性能。· 在运行时判断任意一个对象所属的类;· 在运行时结构任意一个类的对象;· 在运行时批改任意一个对象的成员变量;· 在运行时调用任意一个对象的办法。
举荐一篇反射的文章:
type 包
① MyBatis 为简化配置文件提供了 别名机制,该机制是类型转换模块的次要性能之一。
② 类型转换模块的另一个性能是实现 JDBC 类型与 Java 类型之间的转换,该性能在为 SQL 语句绑定实参以及映射查问后果集时都会波及:
- 在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。
- 而在映射后果集时,会将数据由 JDBC 类型转换成 Java 类型。
logging
包
无论在开发测试环境中,还是在线上生产环境中,日志在整个零碎中的位置都是十分重要的。良好的日志性能能够帮忙开发人员和测试人员疾速定位 Bug 代码,也能够帮忙运维人员疾速定位性能瓶颈等问题。目前的 Java 世界中存在很多优良的日志框架,例如 Log4j、Log4j2、Slf4j 等。
MyBatis 作为一个设计低劣的框架,除了提供具体的日志输入信息,还要可能集成多种日志框架,其日志模块的一个次要性能就是 集成第三方日志框架。
io
包
资源加载模块,次要是对类加载器进行封装,确定类加载器的应用程序,并提供了加载类文件以及其余资源文件的性能。
parsing
包
顾名思义解析器模块,次要提供了两个性能:
- 一个性能,是对
XPath
进行封装,为MyBatis
初始化时解析mybatis-config.xml
配置文件以及映射配置文件提供反对。 - 另一个性能,是为解决动静 SQL 语句中的占位符提供反对。
datasource
包
数据源是理论开发中罕用的组件之一。当初开源的数据源都提供了比拟丰盛的性能,例如,连接池性能、检测连贯状态等,抉择性能优良的数据源组件对于晋升 ORM 框架乃至整个利用的性能都是十分重要的。
MyBatis
本身提供了相应的数据源实现,当然 MyBatis 也提供了与第三方数据源集成的接口,这些性能都位于数据源模块之中。
transaction
包
MyBatis
对数据库中的事务进行了形象,其本身提供了相应的事务接口和简略实现。在很多场景中,MyBatis
会与 Spring 框架集成,并由 Spring 框架治理事务。
cache
包
在优化零碎性能时,优化数据库性能是十分重要的一个环节,而增加缓存则是优化数据库时最无效的伎俩之一。正确、正当地应用缓存能够将一部分数据库申请拦挡在缓存这一层。
MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于根底反对层中的缓 存模块实现的。这里须要读者留神的是,MyBatis 中自带的这两级缓存与 MyBatis 以及整个利用是运行在同一个 JVM 中的,共享同一块堆内存。如果这两级缓存中的数据量较大,则可能影响零碎中其余性能的运行,所以当须要缓存大量数据时,优先思考应用 Redis、Memcache 等缓存产品。
binding
包
在调用 SqlSession 相应办法执行数据库操作时,须要指定映射文件中定义的 SQL 节点,如果呈现拼写错误,咱们只能在运行时能力发现相应的异样。为了尽早发现这种谬误,MyBatis 通过 Binding 模块,将用户自定义的 Mapper 接口与映射配置文件关联起来,零碎能够通过调用自定义 Mapper 接口中的办法执行相应的 SQL 语句实现数据库操作,从而防止上述问题。
值得读者留神的是,开发人员毋庸编写自定义 Mapper 接口的实现,MyBatis 会主动为其创立动静代理对象。在有些场景中,自定义 Mapper 接口能够齐全代替映射配置文件,但有的映射规定和 SQL 语句的定义还是写在映射配置文件中比拟不便,例如动静 SQL 语句的定义。
annotations
包
随着 Java 注解的缓缓风行,MyBatis 提供了 注解 的形式,使得咱们不便的在 Mapper 接口上编写简略的数据库 SQL 操作代码,而无需像之前一样,必须编写 SQL 在 XML 格局的 Mapper 文件中。尽管说,理论场景下,大家还是喜爱在 XML 格局的 Mapper 文件中编写相应的 SQL 操作。
exceptions
包
exceptions 包中有三个与 Exception 相干的类:
- IbatisException 类(曾经设置为不举荐应用了)、
- PersistenceException 类
- TooManyResultsException 类
在 MyBatis 的其余包中,还有许多异样类。这些异样类中除 RuntimeSqlException 类外,均为 PersistenceException 的子类。
MyBatis 中异样类类图:
简直每个都有阈值对应的自定义异样。
scripting
包
拼凑 SQL 语句是一件繁缛且易出错的过程,为了将开发人员从这项干燥无趣的工作中 解脱进去,MyBatis 实现 动静 SQL 语句 的性能,提供了多种动静 SQL 语句对应的节点。例如<where>
节点、<if>
节点、<foreach>
节点等。通过这些节点的组合应用,开发人 员能够写出简直满足所有需要的动静 SQL 语句。
MyBatis 中的 scripting
模块,会依据用户传入的实参,解析映射文件中定义的动静 SQL 节点,并造成数据库可执行的 SQL 语句。之后会解决 SQL 语句中的占位符,绑定用户传入的实参。
plugin
包
Mybatis 本身的性能尽管弱小,然而并不能完满切合所有的利用场景,因而 MyBatis 提供了插件接口,咱们能够通过增加用户自定义插件的形式对 MyBatis 进行扩大。用户自定义插件也能够扭转 Mybatis 的默认行为,例如,咱们能够拦挡 SQL 语句并对其进行重写。
因为用户自定义插件会影响 MyBatis 的外围行为,在应用自定义插件之前,开发人员须要理解 MyBatis 外部的原理,这样能力编写出平安、高效的插件。
session 包
接口层绝对简略,其外围是 SqlSession 接口,该接口中定义了 MyBatis 裸露给应用程序调用的 API,也就是下层利用与 MyBatis 交互的桥梁。接口层在接管到调用申请时,会调用外围解决层的相应模块来实现具体的数据库操作。
executor 包
次要负责保护一级缓存和二级缓存,并提供事务管理的相干操作,它会将数据库相干操作委托给 StatementHandler 实现。
mapping 包
mapping 次要是 SQL 操作解析后的映射
builder 包
builder 是配置和注解的解析过程。
cursor 包
解决游标相干的代码。实话实说,工作中用到很少,所以这里就不开展介绍。
jdbc
包
生成 JDBC 能解决的语句。
lang 包
指定应用 Java7 还是 Java8 的 API 的注解。
总结
面对如何看源码,很多人都无从下手,有的人也是瞎搞,到最初必定看一点点就放弃了。
对于看源码的套路,集体倡议:
1. 学会应用,必须要纯熟应用;
2. 先把握一些常见的设计模式(工厂模式、单列模式、模板办法模式、装璜器模式、代理模式等);
3. 相熟设计原理;
4. 相熟源代码的这个包目录,以及每个包的大抵性能;
5. 多思考为什么是这样;
6. 王者模式:既然你会用了,那么如果让你来设计,你会怎么设计?
举荐浏览
并发编程大扫盲:带你理解何为线程上下文切换
吊打面试官系列:final、finally、finalize 有什么区别?
《写给大忙人看的 JAVA 核心技术》.pdf