Mybatis 源码学习(一)

Mybatis 源码学习(一)

准备:
  1. 认识mybatis的整体架构,主要的类的作用。
  2. 下载mybatis源码,导入idea开发工具,编写mybatis的测试需要的类、全局配置文件等。
  3. 通过断点调试来完成Mybatis的源码阅读。

认识Mybatis

mybatis简介

​ mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。mybatis几乎避免了所有的jdbc代码和手动设置参数以及获取结果集,它可以使用简单的XML或注解的来配置和映射SQL信息,将接口和java 的 POJOs(Plain Old java Objects , 普通的java对象) 映射成数据库中的记录。

  • mybatis GitHub源码地址

    mybatis的架构图
    Mybatis 源码学习(一)
  • 接口层:sqlsession—>接口层是mybatis提供给开发人员的一套API,只要使用sqlsession接口。通过SqlsessionMapper接口,开发人员可以通知Mybatis框架调用哪一条SQL命令以及SQL命令关联参数;

  • 数据处理层:数据处理层是Mybatis框架内部的核心实现,来完成对映射文件的解析与数据处理;

    • 参数解析和参数绑定;
    • SQL解析;
    • 结果集映射解析与结果集映射处理;
  • 支撑层:支撑层用来完成Mybatis与数据库基本链接方式以及SQL命令与配置文件对应,主要负责:

    • Mybatis与数据库的连接方式管理;
    • Mybatis对事务管理方式;
    • 配置文件的加载;
    • Mybatis查询缓存管理;
Mybatis架构流程图

Mybatis 源码学习(一)

  1. Mybatis配置文件:
    • SqlMapConfig.xml:此文件作为Mybatis的全局配置文件,配置了Mybatis的运行时的环境等信息;
    • Mapper.xml:此文件作为mybatis的sql映射文件,文件中配置了操作数据库的SQL语句。此文件需要在SqlMapConfig.xml文件中加载;
  2. SqlSessionFactory:通过mybatis环境等配置信息构造SqlsessionFactory,即会话工厂;
  3. SqlSession :通过SqlSessionFactory会话工厂创建SqlSession即会话,程序员通过SqlSession会话接口对数据库进行增删改查操作;
  4. Executor:执行器,mybatis底层定义了Executor执行器接口来具体操作数据库,Executor接口有两个实现,一个是基本执行器(默认)、一个是缓存执行器,SqlSession底层是通过Executor接口来操作数据库的;
  5. MappedStatement:它也mybatis的底层封装对象,它包含了mybatis配置信息及SQL映射信息等。***Mapper.xml文件中一个select|insert|update|delete标签对应一个MappedStatement对象,select|insert|update|delete的id就是MappedStatement的id;
    • MappedStatement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数;
    • MappedStatement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程就是jdbc编程中对结果集的解析处理过程;
Mybatis的调用流程图

Mybatis 源码学习(一)

  1. SQLSession:接收开发人员提供的Statement id和参数,并返回操作结果;
  2. Executor:Mybatis执行器,Mybatis调度的核心,负责SQL语句的生成和查询缓存的维护;
  3. StatementHandler:封装了jdbc Statement的操作,负责对jdbc Statement的操作,如设置参数、将Statement的结果集转换成List集合;
  4. ParameterHandler:负责对用户传递的参数转换成jabc Statement所需要的参数;
  5. ResultSetHandler:负责将jabc返回的ResultSet结果集对象换成List类型的集合;
  6. TypeHandler:负责将java数据类型和jdbc数据类型之间的映射和转换;
  7. MappedStatement:维护了一条<select|update|insert|delete>节点的封装;
  8. SqlSource:负责根据用户传递的parameterObject,动态的生成SQl语句,将信息封装到BoundSql对象中,并返回BoundSql表示动态生成的SQL语句以及相应的参数信息;
  9. Configuration:Mybatis的所有配置信息都维持在Configuration中;