MyBatis的工作原理
(1)读取MyBatis配置文件
mybatis-config.xml 是MyBatis的全局配置文件,配置了Mybatis的运行环境等消息。
(2)加载映射文件
映射文件既是SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂
通过Mybatis的环境等配置信息构建会话工厂SqlSessionFactory.
(4)创建会话对象
由会话工厂创建SqlSession会话对象,该对象中包含了执行SQL语句的所有方法。
(5)Executor执行器
MyBatis底层定义了一个Excutor接口来操作数据库,它根据SqlSession对象传递的参数动态生成需要执行SQL语句,同时负责查询缓存的维护。
(6)MappedStatement对象
在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息
(7)输入参数映射
输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
(8)输出结果映射
输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
Mybatis实现原理
Mybatis底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSession,Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程。
Executor 执行器(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler 参数处理器:(getParameterObject, setParameters)
结果处理器 ResultSetHandler: (handleResultSets, handleOutputParameters)
StatementHandler sql查询处理器:(prepare, parameterize, batch, update, query)
其中StatementHandler用通过ParameterHandler与ResultSetHandler分别进行参数预编译 与结果处理。而ParameterHandler与ResultHandler都使用TypeHandler进行映射,如下图:
MyBatis的功能架构是怎样的
Mybatis的功能架构分为三层
<1>API接口层
提供给外部使用的接口API,开发人员通过这些本地API来操作数据库。接口层一旦接收到调用请求就会调用数据处理层来完成具体的数据处理
<2>数据处理层
负责具体的SQL查找,SQL解析、SQL执行和执行结果映射处理等操作。它主要目的是根据调用的请求完成一次数据库操作。
核心处理层主要做了这4件事:
把接口中传入的参数解析并映射成JDBC类型;
解析xml文件中的SQL语句,包括插入参数和动态SQL的生成;
执行SQL语句;
处理结果集,并映射成Java对象。
插件也属于核心层,这是由它的工作方式和拦截的对象决定的。
<3>基础支撑层
负责最基础的功能支撑,包括连接管理/事务管理/配置加载/缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
MyBatis的框架架构设计
这张图从上往下看。MyBatis的初始化,会从mybatis-config.xml配置文件,解析构造成Configuration这个类,就是图中的红框。
(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID以及传入(可以是Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后得到最终要执行的SQL语句和参数。
(3)SQL执行:将最终得到SQL语句以及参数拿到数据库上执行,得到操作数据库的结果。
(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
MyBatis层次结构:
BoundSql
表示动态生成的SQL语句以及相应的参数信息。