功能分层
按照功能来对Mybatis整个插件进行分层:
- 接口层:对外支持,由外部调用接口,比如说是sqlSession调用内置selectOne等方法,两种模式支持
- 传统模式,接口 + 实现类,传入statementId和参数进行调用
- 动态代理,getMapper方法获取代理对象,代理对象调用方法
- 数据处理层:做的是预处理sql、执行sql以及执行结果映射,其实就是与数据库操作
- 架构基础支持层:支持数据以外的处理,包括了配置文件的解析、事务、缓存、连接等,通用的东西。
主要对象
- SqlSession:顶层API接口,会话对象,完成数据的增删改查。
- Executor:Mybatis执行器,调度核心,负责sql生成以及缓存操作。
- StatementHandler:封装JDBC statement操作,如设置参数、将statement结果集转为List
- ParameterHandler:参数解析和设置,将Java参数转化为statement参数
- ResultSetHandler:负责对查询结果集进行处理和解析,也就是将ResultSet结合转化为Java集合等对象
- TypeHandler
:负责JdbcType和JavaType之间的转换 - MappedStatement:维护增删改查节点的封装
- SqlSource:根据用户传入ParameterObject,动态生成sql语句,将信息封装到BoundSql中,并返回
- BoundSql:动态生成的sql语句以及参数信息
执行流程
1. 加载配置文件
加载的配置文件包括两个部分:一个是config配置文件,解析成为Configuration对象;另一个就是mapper配置文件或者是接口注解,因为两种方式开发 ,解析成为MapperStatement对象。2. 接收调用请求
调用mybatis提供的api,接收参数参数,并将请求转发给下层去处理3. 处理操作请求
根据传入参数确定statementId,根据statementId找到StatementMapper对象,获取到sql,根据传入对象来确定最终执行的sql以及参数。接下来就是获取数据库连接,根据上面的sql以及参数来进行执行。根据StatementMapper的返回类型以及结果映射来对执行结果进行转换处理,得到最终的执行结果。4. 返回结果处理
得到执行结果之后返回就可以。
其实整体流程按照我的理解来说:
- 加载配置文件,封装Configuration对象以及MappedStatement对象
- 根据Configuration对象创建SqlSessionFactory工厂
- 工厂模式创建SqlSession
- SqlSession执行sql,开始进入数据处理层
- ParameterHandler进行参数解析以及sql预处理,封装BoundSql
- Executor执行器执行sql并返回ResultSetHandler进行返回结果处理
- 根据MappedStatement的resultType或者resultMap以及借助TypeHandler来进行结果映射
- 封装二级果进行返回
我的理解目前是这样的,如果后面有新的理解再进行补充。