Skip to content

Commit 746d6a8

Browse files
committed
📝 Writing docs.
1 parent 49fd6db commit 746d6a8

2 files changed

Lines changed: 81 additions & 25 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
- Platform
1212
- [x] [Spring](https://github.com/dunwu/spring-notes)
1313
- ORM
14-
- [ ] Mybatis
14+
- [ ] [Mybatis](docs/standalone/orm/mybatis.md)
1515
- [ ] Hibernate
1616
- 安全
1717
- [ ] [Shiro](docs/standalone/security/shiro.md) - 安全框架,具有认证、授权、加密、会话管理功能。

docs/standalone/orm/mybatis.md

Lines changed: 80 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,55 @@ tags:
1010

1111
# MyBatis
1212

13-
> MyBatis 的前身就是 iBatis ,是一个数据持久层(ORM)框架。
13+
> MyBatis 的前身就是 iBatis ,是一个作用在数据持久层的对象关系映射(Object Relational Mapping,简称 ORM框架。
1414
1515
<!-- TOC depthFrom:2 depthTo:3 -->
1616

17-
- [MyBatis 的框架设计](#mybatis-的框架设计)
18-
- [接口层](#接口层)
19-
- [数据处理层](#数据处理层)
20-
- [框架支撑层](#框架支撑层)
21-
- [引导层](#引导层)
22-
- [MyBatis 的主要构件及其相互关系](#mybatis-的主要构件及其相互关系)
17+
- [概述](#概述)
18+
- [MyBatis vs. Hibernate](#mybatis-vs-hibernate)
19+
- [MyBatis 的架构](#mybatis-的架构)
20+
- [接口层](#接口层)
21+
- [使用传统的 MyBatis 提供的 API](#使用传统的-mybatis-提供的-api)
22+
- [使用 Mapper 接口](#使用-mapper-接口)
23+
- [数据处理层](#数据处理层)
24+
- [参数映射和动态 SQL 语句生成](#参数映射和动态-sql-语句生成)
25+
- [SQL 语句的执行以及封装查询结果集成 `List<E>`](#sql-语句的执行以及封装查询结果集成-liste)
26+
- [框架支撑层](#框架支撑层)
27+
- [事务管理机制](#事务管理机制)
28+
- [连接池管理机制](#连接池管理机制)
29+
- [缓存机制](#缓存机制)
30+
- [SQL 语句的配置方式](#sql-语句的配置方式)
31+
- [引导层](#引导层)
32+
- [主要组件](#主要组件)
2333
- [资料](#资料)
2434
- [官方](#官方)
2535
- [第三方](#第三方)
2636

2737
<!-- /TOC -->
2838

29-
## MyBatis 的框架设计
39+
## 概述
40+
41+
### MyBatis vs. Hibernate
42+
43+
Mybatis 优势
44+
45+
- MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
46+
- MyBatis 容易掌握,而 Hibernate 门槛较高。
47+
48+
Hibernate 优势
49+
50+
- Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。
51+
- Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
52+
- Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
53+
- Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。
54+
55+
### MyBatis 的架构
3056

3157
<div align="center">
3258
<img src="https://raw.githubusercontent.com/dunwu/java-web/master/images/standalone/orm/mybatis/mybatis架构图2.png">
3359
</div>
3460

35-
### 接口层
61+
## 接口层
3662

3763
接口层负责和数据库交互的方式
3864

@@ -41,7 +67,7 @@ MyBatis 和数据库的交互有两种方式:
4167
1. 使用传统的 MyBatis 提供的 API;
4268
2. 使用 Mapper 接口
4369

44-
#### 使用传统的 MyBatis 提供的 API
70+
### 使用传统的 MyBatis 提供的 API
4571

4672
这是传统的传递 Statement Id 和查询参数给 SqlSession 对象,使用 SqlSession 对象完成和数据库的交互;MyBatis 提供了非常方便和简单的 API,供用户实现对数据库的增删改查数据操作,以及对数据库连接信息和 MyBatis 自身配置信息的维护操作。
4773

@@ -51,7 +77,7 @@ MyBatis 和数据库的交互有两种方式:
5177

5278
上述使用 MyBatis 的方法,是创建一个和数据库打交道的 SqlSession 对象,然后根据 Statement Id 和参数来操作数据库,这种方式固然很简单和实用,但是它不符合面向对象语言的概念和面向接口编程的编程习惯。由于面向接口的编程是面向对象的大趋势,MyBatis 为了适应这一趋势,增加了第二种使用 MyBatis 支持接口(Interface)调用方式。
5379

54-
#### 使用 Mapper 接口
80+
### 使用 Mapper 接口
5581

5682
MyBatis 将配置文件中的每一个 `<mapper>` 节点抽象为一个 Mapper 接口,而这个接口中声明的方法和跟 `<mapper>` 节点中的 `<select|update|delete|insert>` 节点相对应,即 `<select|update|delete|insert>` 节点的 id 值为 Mapper 接口中的方法名称,parameterType 值表示 Mapper 对应方法的入参类型,而 resultMap 值则对应了 Mapper 接口表示的返回值类型或者返回结果集的元素类型。
5783

@@ -63,51 +89,81 @@ MyBatis 将配置文件中的每一个 `<mapper>` 节点抽象为一个 Mapper
6389

6490
MyBatis 引用 Mapper 接口这种调用方式,纯粹是为了满足面向接口编程的需要。(其实还有一个原因是在于,面向接口的编程,使得用户在接口上可以使用注解来配置 SQL 语句,这样就可以脱离 XML 配置文件,实现“0 配置”)。
6591

66-
### 数据处理层
92+
## 数据处理层
6793

6894
数据处理层可以说是 MyBatis 的核心,从大的方面上讲,它要完成两个功能:
6995

7096
1. 通过传入参数构建动态 SQL 语句;
7197
2. SQL 语句的执行以及封装查询结果集成 `List<E>`
7298

73-
#### 参数映射和动态 SQL 语句生成
99+
### 参数映射和动态 SQL 语句生成
74100

75101
动态语句生成可以说是 MyBatis 框架非常优雅的一个设计,MyBatis 通过传入的参数值,**使用 Ognl 来动态地构造 SQL 语句**,使得 MyBatis 有很强的灵活性和扩展性。
76102

77103
参数映射指的是对于 java 数据类型和 jdbc 数据类型之间的转换:这里有包括两个过程:查询阶段,我们要将 java 类型的数据,转换成 jdbc 类型的数据,通过 `preparedStatement.setXXX()` 来设值;另一个就是对 resultset 查询结果集的 jdbcType 数据转换成 java 数据类型。
78104

79-
#### SQL 语句的执行以及封装查询结果集成 `List<E>`
105+
### SQL 语句的执行以及封装查询结果集成 `List<E>`
80106

81107
动态 SQL 语句生成之后,MyBatis 将执行 SQL 语句,并将可能返回的结果集转换成 `List<E>` 列表。MyBatis 在对结果集的处理中,支持结果集关系一对多和多对一的转换,并且有两种支持方式,一种为嵌套查询语句的查询,还有一种是嵌套结果集的查询。
82108

83-
### 框架支撑层
109+
## 框架支撑层
84110

85-
#### 事务管理机制
111+
### 事务管理机制
86112

87-
事务管理机制对于 ORM 框架而言是不可缺少的一部分,事务管理机制的质量也是考量一个 ORM 框架是否优秀的一个标准,对于数据管理机制我已经在我的博文《深入理解 mybatis 原理》 MyBatis 事务管理机制 中有非常详细的讨论,感兴趣的读者可以点击查看
113+
对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis 将事务抽象成了 Transaction 接口
88114

89-
#### 连接池管理机制
115+
MyBatis 的事务管理分为两种形式:
116+
117+
1. 使用 JDBC 的事务管理机制:即利用 java.sql.Connection 对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等。
118+
2. 使用 MANAGED 的事务管理机制:这种机制 MyBatis 自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理。
119+
120+
### 连接池管理机制
90121

91122
由于创建一个数据库连接所占用的资源比较大, 对于数据吞吐量大和访问量非常大的应用而言,连接池的设计就显得非常重要,对于连接池管理机制我已经在我的博文《深入理解 mybatis 原理》 Mybatis 数据源与连接池 中有非常详细的讨论,感兴趣的读者可以点击查看。
92123

93-
#### 缓存机制
124+
### 缓存机制
125+
126+
MyBatis 将数据缓存设计成两级结构,分为一级缓存、二级缓存:
127+
128+
- **一级缓存是 Session 会话级别的缓存**,位于表示一次数据库会话的 SqlSession 对象之中,又被称之为本地缓存。一级缓存是 MyBatis 内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改);
129+
- **二级缓存是 Application 应用级别的缓存**,它的是生命周期很长,跟 Application 的声明周期一样,也就是说它的作用范围是整个 Application 应用。
130+
131+
<div align="center">
132+
<img src="https://raw.githubusercontent.com/dunwu/java-web/master/images/standalone/orm/mybatis/mybatis缓存架构示意图.png">
133+
</div>
134+
135+
#### 一级缓存的工作机制
136+
137+
一级缓存是 Session 会话级别的,一般而言,一个 SqlSession 对象会使用一个 Executor 对象来完成会话操作,Executor 对象会维护一个 Cache 缓存,以提高查询性能。
138+
139+
<div align="center">
140+
<img src="https://raw.githubusercontent.com/dunwu/java-web/master/images/standalone/orm/mybatis/SqlSession一级缓存的工作流程.png">
141+
</div>
142+
143+
144+
#### 二级缓存的工作机制
145+
146+
如上所言,一个 SqlSession 对象会使用一个 Executor 对象来完成会话操作,MyBatis 的二级缓存机制的关键就是对这个 Executor 对象做文章。如果用户配置了 `"cacheEnabled=true"`,那么 MyBatis 在为 SqlSession 对象创建 Executor 对象时,会对 Executor 对象加上一个装饰者:CachingExecutor,这时 SqlSession 使用 CachingExecutor 对象来完成操作请求。CachingExecutor 对于查询请求,会先判断该查询请求在 Application 级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的 Executor 对象来完成查询操作,之后 CachingExecutor 会将真正 Executor 返回的查询结果放置到缓存中,然后在返回给用户。
147+
148+
<div align="center">
149+
<img src="https://raw.githubusercontent.com/dunwu/java-web/master/images/standalone/orm/mybatis/使用与未使用二级缓存的区别.png">
150+
</div>
94151

95-
为了提高数据利用率和减小服务器和数据库的压力,MyBatis 会对于一些查询提供会话级别的数据缓存,会将对某一次查询,放置到 SqlSession 中,在允许的时间间隔内,对于完全相同的查询,MyBatis 会直接将缓存结果返回给用户,而不用再到数据库中查找。
96152

97-
#### SQL 语句的配置方式
153+
### SQL 语句的配置方式
98154

99155
传统的 MyBatis 配置 SQL 语句方式就是使用 XML 文件进行配置的,但是这种方式不能很好地支持面向接口编程的理念,为了支持面向接口的编程,MyBatis 引入了 Mapper 接口的概念,面向接口的引入,对使用注解来配置 SQL 语句成为可能,用户只需要在接口上添加必要的注解即可,不用再去配置 XML 文件了,但是,目前的 MyBatis 只是对注解配置 SQL 语句提供了有限的支持,某些高级功能还是要依赖 XML 配置文件配置 SQL 语句。
100156

101-
### 引导层
157+
## 引导层
102158

103159
引导层是配置和启动 MyBatis 配置信息的方式。MyBatis 提供两种方式来引导 MyBatis :
104160

105161
1. 基于 XML 配置文件的方式
106162
2. 基于 Java API 的方式
107163

108-
## MyBatis 的主要构件及其相互关系
164+
## 主要组件
109165

110-
从 MyBatis 代码实现的角度来看,MyBatis 的主要的核心部件有以下几个
166+
从 MyBatis 代码实现的角度来看,MyBatis 的主要组件有以下几个
111167

112168
- **SqlSession** - 作为 MyBatis 工作的主要顶层 API,表示和数据库交互的会话,完成必要数据库增删改查功能。
113169
- **Executor** - MyBatis 执行器,是 MyBatis 调度的核心,负责 SQL 语句的生成和查询缓存的维护。

0 commit comments

Comments
 (0)