@@ -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 和数据库的交互有两种方式:
41671 . 使用传统的 MyBatis 提供的 API;
42682 . 使用 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
5682MyBatis 将配置文件中的每一个 ` <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
6490MyBatis 引用 Mapper 接口这种调用方式,纯粹是为了满足面向接口编程的需要。(其实还有一个原因是在于,面向接口的编程,使得用户在接口上可以使用注解来配置 SQL 语句,这样就可以脱离 XML 配置文件,实现“0 配置”)。
6591
66- ### 数据处理层
92+ ## 数据处理层
6793
6894数据处理层可以说是 MyBatis 的核心,从大的方面上讲,它要完成两个功能:
6995
70961 . 通过传入参数构建动态 SQL 语句;
71972 . 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
1051611 . 基于 XML 配置文件的方式
1061622 . 基于 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