【Mybatis】- 框架架构

Mybatis怎么理解

借用官网的介绍:

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

总的来说可以分为三部分

  1. 是一个支持自定义SQL,存储过程和高级映射的持久性框架;
  2. 几乎消除了所有JDBC代码和手动设置参数以及检索结果。
  3. 可以使用简单的XML或Annotations来配置和映射基元,Map接口和Java POJO(Plain Old Java Objects)到数据库记录

框架

【Mybatis】- 框架架构

这是Mybatis最经典的架构图,如何理解这幅图呢?

  1. 首先映入眼帘的是红色的Configuration对象,这个对象是将mybatis配置文件,mapper文件,以及java代码注解封装成了一个整体。
  2. 然后会和mapper接口进行关联;
  3. 接着当mapper接口接受到调用请求,会接收到传入SQL的ID和传入对象(也就是左边的三个“轮子”),mybatis会根据sql的id找到对应的MapperStatement(一个sql就是一个statement)并进行解析,解析后得到最终要执行的sql。 通过mapper Statements进行操作
  4. 然后将得到的sql和参数拿到数据库去执行,得到最终的结果,然后将得到的结果按映射的配置,转换为右边的三个“轮子”,输出。

具体执行过程

【Mybatis】- 框架架构

  1. 首先我们需要Mybatis的全局配置文件sqlMapConfig.xml以及映射文件Mapper.xml,这两类文件在程序初始化时会读取到框架图中的Configuration对象中,进行封装处理。
  2. 然后会通过Configuration对象来创建SqlSessionFactory回话工厂;
  3. 接着通过SqlSessionFactory回话工厂创建sqlSession。sqlSession是面向程序员的接口,程序员可以通过sqlSession操作数据库。
  4. 然后调用sqlSession的方法去操作数据库,如果需要提交事务,需要执行sqlSession的commit()方法;

对sqlSession的理解

【Mybatis】- 框架架构

上边的执行过程,可以抽象成这幅图,这幅图看起来就简介很多。我们可以看到,以sqlSession为界,分为了两部分:

  1. 从Configuration到SqlSession可以成为操作手册或者配置,控制着mybatis的初始化,以及sqlSession的走向;
  2. 从SqlSession到DB可以成为操作DB部分,这部分是如何操作数据库,以及对jdbc的封装处理。
  3. 所以,SqlSession可以理解为一个承上启下的功能,对上是如何创建sqlSession并指导SqlSession如何操作,对下是SqlSession的具体操作。

sqlSession承上启下的作用,我们可以通过代码来瞅瞅:

【Mybatis】- 框架架构

sqlSession类里注入了两个对象,一个是configuration,一个是executor。为什么要注入这两个对象呢?因为configuration包含所有配置,可以指导sqlSession的执行过程,而executor可以代替sqlSession来执行sql。

所以上一幅图还可以抽象成这样:

【Mybatis】- 框架架构

如何有这幅图来理解mybatis的运作流程呢?只需要解决下面三个问题即可:

  1. sqlSession是如何产生的?以及xml是怎么对应到configuration的?
  2. mapper接口和maper.xml是怎么映射起来的?
  3. mapper接口是如何操作数据库的?

结语

对于mybatis的理解,最后我们可以浓缩为这样一幅图。看书的时候,我们经常说,一本书从厚看薄了,再从薄看厚了,就是真的领悟。学习框架也是一样,从一个完整的框架浓缩为一张简单的uml图,再从一张简单的uml图扩展为完整的框架,那么我们就真的掌握了这个框架。