深入剖析 MyBatis 核心原理模块一:快速入门
一、开篇词 领略 MyBatis 设计思维,突破持久化技术瓶颈
为什么要学习MyBatis
- MyBatis 自身亮点
- MyBatis 本身就是一款设计非常精良、架构设计非常清晰的持久层框架,并且 MyBatis 中还使用到了很多经典的设计模式,例如,工厂方法模式、适配器模式、装饰器模式、代理模式等。
- MyBatis 提供了很多扩展点,例如,MyBatis 的插件机制、对第三方日志框架和第三方数据源的兼容等。
- 开发人员使用 MyBatis 上手会非常快,具有很强的易用性和可靠性。
- MyBatis 在一线互联网大厂中应用广泛,已经成为你进入大厂的必备技能
二、常见持久层框架赏析,到底是什么让你选择MyBatis?
在绝大多数在线应用场景中,数据是存储在关系型数据库中的,作为一个 Java 开发者,几乎天天与关系型数据库打交道,在生产环境中常用的关系型数据库产品有 SQL Server、MySQL、Oracle 等。在使用这些数据库产品的时候,基本上是如下思路:
- 在写Java代码的过程中,使用的是面向对象的思维去实现业务逻辑;
- 在设计数据库表的时候,考虑的是第一范式、第二范式和第三范式;
- 在操作数据库记录的时候,使用 SQL 语句以及集合思维去考虑表的连接、条件语句、子查询等的编写。
这个时候,就需要一座桥梁将 Java 类(或是其他数据结构)与关系型数据库中的表,以及 Java 对象与表中的数据映射起来,实现 Java 程序与数据库之间的交互。JDBC(Java DataBase Connectivity)是 Java 程序与关系型数据库交互的统一 API。
JDBC操作的核心步骤,具体如下:
- 注册数据库驱动类,指定数据库地址,其中包括 DB 的用户名、密码及其他连接信息;
- 调用 DriverManager.getConnection() 方法创建 Connection 连接到数据库;
- 调用 Connection 的 createStatement() 或 prepareStatement() 方法,创建 Statement 对象,此时会指定 SQL(或是 SQL 语句模板 + SQL 参数);
- 通过 Statement 对象执行 SQL 语句,得到 ResultSet 对象,也就是查询结果集;
- 遍历 ResultSet,从结果集中读取数据,并将每一行数据库记录转换成一个 JavaBean 对象;
- 关闭 ResultSet 结果集、Statement 对象及数据库 Connection,从而释放这些对象占用的底层资源。
为了处理上述代码重复的问题以及后续的维护问题,我们在实践中会进行一系列评估,选择一款适合项目需求、符合人员能力的 ORM(Object Relational Mapping,对象-关系映射)框架来封装 1~6 步的重复性代码,实现对象模型、关系模型之间的转换。这正是ORM 框架的核心功能:根据配置(配置文件或是注解)实现对象模型、关系模型两者之间无感知的映射。
Hibernate
Hibernate 是 Java 生态中著名的 ORM 框架之一。
三、订单系统持久层示例分析,20分钟带你快速上手MyBatis
传送门
四、MyBatis源码环境搭建及整体架构解析
下载MyBatis源码
git clone https://github.com/mybatis/mybatis-3.git
cd ./mybatis-3/
git checkout -b mybatis-3.5.6 mybatis-3.5.6
git branch -vv # 检查是否分支切换成功
MyBatis结构简介
MyBatis 分为三层架构,分别是基础支撑层、核心处理层和接口层,如下图所示:
MyBatis三层架构图:
1、基础支撑层
基础支撑层是整个MyBatis框架地基,为整个MyBatis框架提供了非常基础的功能,其中每个模块都提供了一个内聚的、单一的能力,MyBatis基础支撑层按照这些单一的能力可以划分为上图所示的九大基础模块:
- 类型转换模块。
- 日志模块。
- 反射工具模块。
- Binding模块。
- 数据源模块。
- 缓存模块。
- 解析器模块
- 事务管理模块。
- 资源加载模块。
2、核心处理层
核心处理层是MyBatis核心实现所在,其中涉及MyBatis的初始化以及一条SQL语句的全流程。
- 配置解析。
- SQL解析与scripting模块。
- SQL执行。
- 插件。
3、接口层
接口层是MyBatis 暴露给调用的接口集合,这些接口都是使用 MyBatis 时最常用的一些接口,例如,SqlSession接口、SqlSessionFactory接口等。其中,最核心的是SqlSession接口,你可以通过它实现很多功能,例如,获取 Mapper 代理、执行 SQL 语句、控制事务开关等。