作为一个Java程序猿,平时工作中一般都会使用到mybatis的框架,闲来就将这个框架做一个巩固和加深认识,文章打算分为原理篇、手写代码篇、分析源码篇,三个篇章,此为原理篇,里面的内容只是作为回顾和总结,不能保证其完全的准确性,只当做是交流学习,有错误的地方还望各位大佬指正。
架构图:
接口层
接口层是mybatis提供开发人员的一套API,主要通过Session和Mapper接口通知mybatis框架调用哪一条SQL命令以及SQL命令关联的参数;
数据处理层
数据处理层是mybatis框架内部的核心实现,用来完成对映射文件的解析以及数据处理,主要功能如下:
- 参数解析与参数绑定;
- SQL解析;
- 结果集映射解析与结果集映射处理。
基础支撑层
基础支撑层用来完成mybatis与数据库基本连接方式以及SQL命令与配置文件对应,主要功能如下:
- mybatis与数据库连接方式管理;
- mybatis对事务管理的方式;
- 配置文件的加载;
- mybatis查询缓存的管理。
架构流程图
mybatis配置文件
- mybatis-config.xml此文件作为mybatis的全局配置文件,配置了mybatis的运行环境。
- Mapper.xml此文件作为mybatis的SQL映射文件,文件中配置了操作数据库的sql语句。此文件需要在mybatis-confi.xml中加载。
SqlSessionFactory
- 通过mybatis环境等配置信息构造SqlSessionFactory,即会话工厂。
SqlSession
- 通过会话工厂创建SQLSession,通过SQLSession会话接口对数据库进行CRUD操作
Executor执行器
- mybatis底层定义了Executor执行器接口来具体操作数据库,Executor接口有两个实现,一个是基本执行器(默认),一个是缓存执行器,SQLSession底层是通过Executor接口操作数据库的。
MappedStatement
- 为mybatis底层的一个封装对象,它包装了mybatis配置信息以及SQL映射信息等。mapper.xml文件中一个select\insert\update\delete标签对应一个Mapped Statement对象,select\insert\update\delete标签的id,就是mappedStatement的id。
- 它对SQL执行输入参数进行定义,包括hashmap、基本数据类型、pojo。Executor通过MappedStatement在执行sql前将输入的Java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
- 它对SQL执行输出的结果进行定义,包括hashmap、基本数据类型、pojo。Executor通过MappedStatement在执行sql后将输出结果映射至Java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
调用流程图
SQLSession
接收开发人员提供的statementId和参数,并返回操作结果。
Executor
Executor执行器,是mybatis调度核心,负责SQL语句的生成和查询缓存的维护。
StatementHandler
封装了jdbc statement操作,负责对jdbc statement操作,包括对statement设置参数,以及将返回的结果集转换成list。
ParameterHandler
负责对用户传递的参数转换成jdbcstatement所需要的参数。
ResultsetHandler
负责将jdbc返回的resultset结果集对象转换成list。
TypeHandler
负责jdbcType和JavaType之间的数据类型转换
MappedStatement
维护了一条select、insert、update、delete节点的封装
SQLsource
根据用户传入的parameterObject,动态的生成SQL语句,将信息封装到BoundSql对象中,并且返回BoundSql表示动态生成的SQL语句以及相应的参数信息。
Configuration
mybatis的所有配置信息都维持在configuration对象中。