ORM - MyBatis总体流程与架构设计详解


MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单、优雅。本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现。

总体流程

1) 加载配置并初始化

触发条件:加载配置文件

配置来源于两个地方,一处陪住文件,一处java代码的注解,将sql的配置信息加载成为一个个MappedStatement对象(包括了参数映射配置,执行的sql语句,结果映射配置),存储在内存中

2) 接收调用请求

触发条件:调用Mybatis提供的API

传入参数:为SQL的ID和传入参数对象

处理过程:将请求传递给下层的请求处理层进行处理。

3) 处理操作请求

触发条件:API接口层传递请求过来

传入参数:为SQL的ID和传入参数对象

处理过程:

A) 根据SQL的ID查找对应的MappedStatement对象。

B) 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。

C) 获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。

D) 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。

E) 释放连接资源。

4) 返回处理结果

将最终的处理结果返回。

功能架构设计

功能架构设计图

功能架构讲解:

我们把Mybatis的功能架构分为三层:

  1. API接口层 :提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  2. 数据处理层 :负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  3. 基础支撑层 :负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

组件及关系

1. MyBatis主要组件

从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个类:

  • SqlSession :作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
  • Executor :MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler :封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler :负责对用户传递的参数转换成JDBC Statement 所需要的参数,
  • ResultSetHandler :负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
  • TypeHandler :负责java数据类型和jdbc数据类型之间的映射和转换
  • MappedStatement :MappedStatement维护了一条<select|update|delete|insert>节点的封装,
  • SqlSource :负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql :表示动态生成的SQL语句以及相应的参数信息
  • Configuration :MyBatis所有的配置信息都维持在Configuration对象之中。

2. 组件相互关系

它们的关系如下图所示:

组件关系图

引用资料