【MyBatis 源码解析】大纲概述

MyBatis整体架构分为三层:基础支持层、核心处理层、接口层。
image.png

1、基础支持层

基础支持层包含MyBatis整个基础模块,其为核心处理层提供了良好的支持。

  • 反射模块

对Java原生反射进行了良好的封装,提供了更加简洁的API供上层使用。并对缓存进行了一系列的优化。例如缓存了类的元数据,提高了反射操作的性能。

  • 类型转换模块

为简化配置文件,提供了别名机制。该机制是其主要功能之一。另一个功能是实现JDBC类型与Java类型之间的转换,该功能在为SQL绑定实参以及映射查询结果集时都将涉及。在为SQL绑定实参时,会将Java类型转换为JDBC类型。而在映射结果集时,会将JDBC类型转换为Java类型。

  • 日志模块

MyBatis作为一个设计优良的框架,处理提供详细的日志输出信息,还要能够集成多种日志框架。其日志模块的一个主要功能就是集成第三方日志框架。

  • 资源加载模块

主要对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件及其他资源文件的功能。

  • 解析器模块

主要提供了两个功能:一个是对XPath进行封装,为MyBatis初始化解析 mybatis-config.xml 配置文件以及其他映射配置文件提供支持。另一个功能是为处理动态SQL的占位符提供支持。

  • 数据源模块

现在开源数据源都提供了非常丰富的功能。例如连接池、检测连接状态等。MyBatis提供了自身的数据源实现。当然也提供了集成第三方数据源的接口。

  • 事务管理模块

MyBatis对数据库的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis会与Spring进行集成,并有Spring进行事务的管理。

  • 缓存模块

MyBatis中提供了一级缓存和二级缓存。需要注意的是,其提供的缓存与整个应用是运行在同一个JVM中的,共享一块堆内存,当缓存的数据量较大时,可能影响系统其他功能的使用,所以当要缓存的数据比较大时,应优先考虑使用Redis、Memcache等缓存中间价。

  • Binding模块

在通过 sqlSession 相应方法执行数据库操作时,需要指定映射文件中的SQL节点,若出行拼写错误时,只能在运行时才能发现,为尽早发现该种错误,通过该模块将用户自定义的Mapper接口与映射配置文件进行关联。系统可以通过调用Mapper中的方法执行相应的SQL完成数据库操作,从而避免上述操作。
开发人员无需对自定义Mapper接口进行实现,MyBatis会自动为其创建代理对象,在某些场景中,自定义Mapper接口完全可以替代映射配置文件,但有些映射规则及SQL语句的定义还是卸载映射配置文件中更好,例如动态SQL语句。

2、核心处理层

核心处理层实现了MyBatis的核心处理流程,包括MyBatis的初始化以及完成一次数据库操作设计的全部流程

  • 配置解析

MyBatis初始化过程中,会将 mybatis-config.xml、映射配置文件以及Mapper接口中的注解信息进行解析加载,解析后的信息会形成相应的对象并保存到 Configuration 对象中。之后利用 Configuration 对象创建SqlSessionFactory 对象。初始化完成之后,可以通过 SqlSessionFactory 创建 SqlSession 对象并完成数据库的操作。

  • SQL解析与scripting模块

拼接SQL语句,提供实现动态SQL语句的功能,提供了许多节点。如 、、等。
scripting模块会根据用户传入的实参,解析映射文件中定义的动态SQL节点,生成数据库可执行的SQL语句。之后会处理语句中的占位符,绑定传入的实参。

  • SQL执行

SQL的执行设计到多个组件,比较重要的包含 Executor、StatementHandler、ParameterHandler、ResultSetHandler。Executor 主要负责维护一级缓存、二级缓存,并提供事务管理相关的操作,它会将数据库相关操作委托给 StatementHandler 完成。StatementHandler 首先通过 ParameterHandler 完成实参的绑定,然后通过 java.sql.Statement 对象执行SQL语句得到数据结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果并返回。
image.png

  • 插件

Mybatis并不能完美契合所有场景,因此提供了插件接口。使用者可以通过添加自定义的插件来对MyBatis的功能进行扩展。自定义插件也可以改变MyBatis的默认行为。例如可以拦截SQL语句并对其进行重写。

3、接口层

相对简单,其核心为 SqlSession 接口,该接口中定义了MyBatis暴露给应用程序调用的API。是上层应用与MyBatis交互的桥梁。接口层在收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值