【手写MyBatis】(02)- 了解MyBatis架构原理

MyBatis架构原理

架构图

【手写MyBatis】(02)- 了解MyBatis架构原理

接口层

接口层是MyBatis提供给开发人员的一套API.主要使用SqlSession接口.通过SqlSession接口和Mapper接口.开发人员可以通知MyBatis框架调用那一条SQL命令以及SQL命令关联参数.

SqlSession接口使用方式
【手写MyBatis】(02)- 了解MyBatis架构原理

Mapper接口使用方式

【手写MyBatis】(02)- 了解MyBatis架构原理

数据处理层

数据处理层是MyBatis框架内部的核心实现.来完成对映射文件的解析与数据处理:

  • 参数解析与参数绑定
  • SQL解析
  • 结果集映射解析与结果集映射处理

支撑层

支撑层用来完成MyBaits与数据库基本连接方式以及SQL命令与配置文件对应.主要负责:

  • MyBatis与数据库连接方式管理
  • MyBatis对事务管理方式
  • 配置文件加载
  • MyBatis查询缓存管理

架构流程图

【手写MyBatis】(02)- 了解MyBatis架构原理

说明:

mybatis配置文件

  • SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
  • Mapper.xml,此文件作为mybatis的sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  • 全局配置文件和映射文件中的信息最终会被封装到Configuration对象中

SqlSessionFactory

通过mybatis环境等配置信息构造SqlSessionFactory,即会话工厂,用于产生sqlSession对象。

sqlSession

通过会话工厂创建sqlSession即会话,程序员通过sqlsession会话接口对数据库进行增删改查操作。一个CURD对应一个sqlSession.

Executor执行器

mybatis底层自定义了Executor执行器接口来具体操作数据库,Executor接口有两个实现,一个是基本执行器(默认)、一个是缓存执行器,sqlsession底层是通过executor接口操作数据库的。

Mapped Statement

它也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息
等。mapper.xml文件中一个select\insert\update\delete标签对应一个
Mapped Statement对象
,select\insert\update\delete标签的id即是Mapped
statement的id。

Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、
pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql
中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、
pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象
中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

从Configuraion对象的角度看流程

【手写MyBatis】(02)- 了解MyBatis架构原理

Executor执行器在执行CURD的时候需要创建sqlSession对象,使用Configuration获取sql语句及参数,因此Configuration对象由SqlSession对象传递过来。

而sqlSessio对象是通过sqlSessionFactory创建的,所以sqlSession的Configuration对象来源是sqlSessionFactory。

Configuration对象是对全局配置文件和映射文件信息的封装,所以在sqlSessionFactory的创建过程中,调用XMLConfigParser加载配置文件,生成Configuration对象

随后才能进入sqlSession的执行流程

调用流程图

【手写MyBatis】(02)- 了解MyBatis架构原理

各对象解析

SqlSession

接收开发人员提供Statement Id 和参数.并返回操作结果

Executor

MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护

StatementHandler

封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参数、将Statement结果集转换成List集合。

ParameterHandler

负责对用户传递的参数转换成JDBC Statement 所需要的参数

ResultSetHandler

负责将JDBC返回的ResultSet结果集对象转换成List类型的集合

TypeHandler

负责java数据类型和jdbc数据类型之间的映射和转换

MappedStatement

维护了一条<select|update|delete|insert>节点的封装

SqlSource

负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回BoundSql表示动态生成的SQL语句以及相应的参数信息

Configuration

MyBatis所有的配置信息都维持在Configuration对象之中。

四大组件

ExecutorStatementHandlerParameterHandlerResultSetHandler统称为MyBatis四大组件。

针对四大组件可以使用(实现接口)自定义插件去处理相关的代码,比如分页插件PageHelper。

Mapper代理执行流程图

【手写MyBatis】(02)- 了解MyBatis架构原理