Mybatis 源码深度剖析

文章目录

  • 一、手写Mybatis
  • 二、Mybatis高级应用
  • 三、Mybatis源码
    • 1. MyBatis初始化过程
    • 2. MyBatis执行Sql过程
    • 3. MyBatis执行器executor
    • 4. MyBatis StatementHandler
    • 5. MyBatis的mapper代理方式getMapper()
    • 6. MyBatis的invoke方法
    • 7. 二级缓存
      • 7.1 cache标签
      • 7.2 执行流程
      • 7.3 生效机制
      • 7.4 刷新
    • 8. 延迟加载
      • 8.1 如何应用
        • 8.1.1 局部延迟加载
        • 8.1.2 全局延迟加载
      • 8.2 实现原理
      • 8.3 延迟加载源码-创建代理对象
      • 8.4 延迟加载源码-invoke方法执行

一、手写Mybatis

篇幅限制,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122894621

二、Mybatis高级应用

篇幅限制,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122927196

三、Mybatis源码

Mybatis架构原理

Mybatis 源码深度剖析_第1张图片

  1. API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操作数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。MyBatis和数据库的交互有两种方式:
  1. 使用传统MyBatis提供的API
  2. 使用Mapper代理的方式
  1. 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。主要目的是根据调用的请求完成一次数据库操作
  2. 基础支持层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的,将他们抽取出来作为最基础的组件,为上层数据处理层提供最基础的支撑
主要构件

Mybatis 源码深度剖析_第2张图片

构件 描述
SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
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语句以及相应的参数信息
总体流程
  1. 加载配置并初始化(触发条件:加载配置文件)
  1. 配置来源为配置文件(核心配置文件.xml,mapper.xml),Java代码中的注解,将主配置文件内容解析封装到Configuration,将sql的配置信息加载成为一个mappedstatement对象,存储在内存之中。
  1. 接收调用请求(触发条件:调用MyBatis提供的API)
  1. 传入参数:SQL的ID和传入的参数对象
  2. 处理过程:将请求传递给下层的请求处理层进行处理
  1. 处理操作请求(触发条件:API接口层传递请求过来,包括SQL的ID和参数对象)
  1. 根据SQL的ID查找对应的MappedStatement对象
  2. 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数
  3. 获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果
  4. 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
  5. 释放连接资源。
  1. 返回处理结果,将最终处理结果返回

1. MyBatis初始化过程

结论
  1. Resources.getResourceAsStream(“sqlMapConfig.xml”);加载配置文件为字节输入了
  2. SqlSessionFactoryBuilder().build(resourceAsSteam);使用构建者模式,构建SqlSessionFactory对象
  3. 构建SqlSessionFactory对象,需要Configuration对象(MyBatis核心配置类),所以通过解析XML文件,将配置信息全部封装到Configuration对象中。其中< mapper>标签映射的mapper.xml的映射文件内容,会封装到Configuration中的mappedStatements容器中
  4. mappedStatements是一个map,key是namespace.id,value是MappedStatement对象,此对象用于封装