功能分层

按照功能来对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. 返回结果处理

    得到执行结果之后返回就可以。

其实整体流程按照我的理解来说:

  1. 加载配置文件,封装Configuration对象以及MappedStatement对象
  2. 根据Configuration对象创建SqlSessionFactory工厂
  3. 工厂模式创建SqlSession
  4. SqlSession执行sql,开始进入数据处理层
  5. ParameterHandler进行参数解析以及sql预处理,封装BoundSql
  6. Executor执行器执行sql并返回ResultSetHandler进行返回结果处理
  7. 根据MappedStatement的resultType或者resultMap以及借助TypeHandler来进行结果映射
  8. 封装二级果进行返回

我的理解目前是这样的,如果后面有新的理解再进行补充。