手写Mybatis(二)
手写Mybatis(二)
一中讲述了,编写Mybatis的需求以及思路,这一篇我们来聊一下Mybatis的内容。
一、Mybatis架构图
- 接口层
接口层是MyBatis提供给开发人员的一套API,主要使用SqlSession接口。通过SqlSession接口和Mapper 接口,开发人员可以通知MyBatis框架调用那一条SQL命令以及SQL命令关联参数。 - 数据处理层
数据处理层是MyBatis框架内部的核心实现。来完成对映射文件的解析与数据处理,包括:- 参数解析与参数绑定
- SQL解析
- 结果集映射解析与结果集映射处理
- 支撑层
支撑层用来完成MyBaits与数据库基本连接方式以及SQL命令与配置文件对应。包括:- MyBatis与数据库连接方式管理
- MyBatis对事务管理方式
- 配置文件加载
- MyBatis查询缓存管理
二、Mybatis架构流程图
- mybatis配置文件 SqlMapConfig.xml
- 此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
- Mapper.xml,此文件作为mybatis的sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。 - SqlSessionFactory
通过mybatis环境等配置信息构造SqlSessionFactory,即会话工厂。 - sqlSession
通过会话工厂创建sqlSession即会话,程序员通过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 编程中对结果的解析处理过程。
三、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对象之中。
最后拓展一张Mapper代理执行原理图:
总结
要想写一个简易的Mybatis,那么就要了解Mybatis的架构、架构流程以及调用流程,这样在写代码的过程中不至于找不到入手点和连接关系,至于再细的内容就需要在代码中体现了。