Mybatis架构原理

166 阅读4分钟

@TOC

Mybatis架构原理

前言

之前在这篇文章里自定义手写了mybatis框架,然后我们来简单的对应着自定义的mybatis简述一下myabtis的架构原理;

自定义Mybatis原理简述

我们来简单的看一下:

  • 首先加载配置文件,自定义mybatis时候 ,即新建了自己的xml配置文件用于存放我们的sql以及参数类型返回值,入参类型;
  • 然后通过SqlSessionFactoryBuilder解析build方法解析xml文件将这些配置加载到内存中,存放在一个全局配置类Configration中;
  • 每一个sql对应的xml信息如,sql信息,入参类型,返回类型,namesapc + . + idmapper规则信息封装到MappedStatement对象中;
  • 之后在定义了SqlSession接口,以及SeqSessionFactory工厂用于创SeqSession会话,用于处理sql请求执行以及返回结果集信息;
  • 定义了具体的sql执行器Excutor接口,用于处理sql的操作查询,增加,删除,更新请求;
  • 具体的执行器SimpleExcutor实现具体的请求;
  • 执行过程中,根据mapper的namesapc和Statement的sql id 对xml中的sql获取到需要执行的sql,然后对sql进行处理得到最终的sql以及传递的参数;
  • 最后编译sql然后执行对sql结果集使用反射将结果集封装并且返回;

Mybatis 架构原理

首先来看一下Mybatis的架构图

在这里插入图片描述

Mybatis主要分为三个层次:

  • 接口层 主要是一些操作数据的API无非就是增删改查,然后我们编写mapper以及xml然后回去调用这些API 这个接口层主要分为:传统的API访问方式和Mapper代理方式

  • 数据处理层

这一层主要负责对mapperxml里面的Sq查找(根据namespace+sql id )进行查找sql,对sql参数进行解析,类型转换,以及结果集的映射处理等操作,主要是对数据库的操作;

  • 框架支撑层 负责最基础的功能支撑,主要是连接,事务,配置加载等,Mysql将其抽取成组件,为上层数据处理提供支撑;

具体构件和相互关系

在这里插入图片描述

在这里插入图片描述

执行流程:

  • 1 加载配置文件 首先对配置的xml配置文件进行加载解析(包括配置文件conf.xml和mapper.xml)前者是配置文件其作用是对mybatis进行一些配置如二级缓存配置,db环境配置,包配置,对象别名配置,插件配置(如分页插件),xml mapper配置等配置,后者是对每个mapper的xml sql的编写配置。将其加载到内存中进行解析,然后将sql 以及 namesapce.id 等属性存储在一个个mappedstatement对象中,最后封装在全局的Configration配置对象中;

  • 2 接收请求 通过调用编写好的mapper接口或者传统的namespace.id方式调用sql执行数据库操作;

    • 1 通过sql namespac.id 在Configration的MappedStatement集合中查找对应的MappedStatement对象
    • 2 然后根据MappedStatement对象获取sql 以及入参类型,返回类型,根据传入的参数类型解析得到最终的sql
    • 3 获取连接,编译最终执行的sql和传入的参数执行,得到返回结果集
    • 4 根据MappedStatement得到的结果类型进行对象转换,返回。
    • 5 释放资源
  • 3 返回结果

总结

通过自定义的Mybatis框架来看和Mybatis的执行流程大体处理流程上是一致的;

  • 首先我们都是进行加载 xml 配置,将配置封装到MappedStatement对象中
  • 然后去执行调用,根据namespace.id去查找某个sql然后根据传入的参数进行sql转换处理得到最终sql
  • 最后通过传入的参数值,编译Sql,赋值,执行,返回值封装结果集,返回。

在Mybatis框架中,具体的步骤都拆解成每个执行器,具体的类有自己的职责去专门处理每个流程,如ParameterHandle用于去传递参数,ResultHandler去负责将Result集合转为List,BoundSql负责解析得到最终的sql,TypeHandler负责将Java和db之间的数据转换。

而在自定义mybatis框架中,除了大致的流程类似之外,没有去执行类的单一职责,耦合性比较大。