16 Star 338 Fork 165

icanci / Java-Review

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
SSM-Mybatis3-源码解读-第2篇-框架目录结构.md 8.15 KB
一键复制 编辑 原始数据 按行查看 历史
icanci 提交于 2020-09-07 10:22 . :zap:更新文件名称

SSM - Mybatis3 - 源码解读 - 第2篇 - 框架目录结构

目录结构

  • 在本文件同级文件 MyBatis源码结构.xmind 包含的就是其源码目录结构
  • 官方文档: https://mybatis.org/mybatis-3/zh/
  • 下面进行截图查看源码进行说明其目录结构

1598930612962

Mybatis整体架构

架构图
  • Mybatis的整体架构分为三层
    • 基础支持层
    • 核心处理层
    • 接口层
  • 整体架构如下

1598938458724

基础支持层
反射模块
  • 对应 reflection
  • Java中的反射功能强大,但是直接写出现高质量的反射代码还是有压力的,所以,Mybatis封装了反射,提供了 简洁易用的API ,方便上层调用,并且 对反射操作进行了一系列优化,例如缓存了类的元数据。提供了反射操作的性能
类型模块
  • 对应type
  • Mybatis为了简化配置文件提供了 别名机制,该机制的类型转换模块的主要功能之一
  • 类型转换模块的另一个功能是 实现JDBC类型与Java类型之间的转换,该功能在为SQL语句绑定以及映射查询结果集的时候都会涉及到
    • 在为SQL语句绑定实参的时候,会把数据由Java类型转换为JDBC类型
    • 而在映射结果集的时候,会把JDBC类型转换为Java类型
日志模块
  • 对应logging
  • 在开发和测试生产环境中,日志在整个系统中都十分重要。
  • Mybatis作为一个优良的框架,除了提供详细的日志输出信息,还能够集成多种日志框架,其日志模块的一个主要功能就是 集成第三方日志框架
IO模块
  • 对应io
  • 资源加载模块,主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能
解析器模块
  • 对应parsing
  • 提供了两个功能
    • XPath进行封装,为Mybatis初始化的时候解析 mybatis-config.xml 配置文件以及映射配置文件支持
    • 为动态处理SQL语句中的占位符提供支持
数据源模块
  • 对应datasource
  • 数据源是实际开发中常用的组件之一。现在开源的数据源都提供了比较丰富的功能,如:连接池功能、检测连接状态等待,优秀的数据源对提高ORM框架乃至整个应用的性能都是非常重要的
  • Mybatis自身提供了相应的数据源实现,当然也提供了与第三方数据源集成的接口,这些功能都位于数据眼模块之中
事务模块
  • 对应transcation
  • Mybatis对数据库中的事务进行了抽象,其自身提供了 相应的事务接口和简单实现
  • 在很多场景中,Mybatis会与Spring框架集成,并由Spring框架管理事务
缓存模块
  • 对应cache
  • 在优化系统性能的时候,优化数据库性能是一个非常重要的欢节。增加缓存时优化数据库操作的最有效的手段之一,正确、合理的使用缓存可以将一部分数据库请求拦截在缓存这一层
  • Mybatis中提供了 一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓存模块实现的。
  • 这里需要注意的是,Mybatis中自带的缓存与Mybatis以及整个应用是运行在同一个JVM中的,共享同一块堆内存。如果这两级缓存中的数据量较大,则可能影响系统中其他功能的运行,所以需要缓存大量数据的时候,优先使用Redis、Memcache等缓存产品
Binding模块
  • 对应binding
  • 在调用SqlSession相应方法执行数据库操作的时候,需要指定映射文件中定义的SQL节点,如果出现拼写错误,我们只能在运行的时候发现异常。
  • 为了尽早发现这种错误,Mybatis通过Binding模块,将用户自定义的Mapper接口与映射配置文件关联起来,系统可以通过Mapper接口中的方法执行响应的SQL语句完成数据库操作,从而避免上述问题
  • 值得注意的是,开发人员无需编写自定义的Mapper接口的实现,Mybatis会自动为其创建动态代理对象。在有些场景中,自定义Mapper接口可以完全替代映射文件,但是有的映射规则和SQL语句的定义还是写在映射配置文件中比较方便,例如动态SQL的定义
注解模块
  • 对应annotations
  • 随着Java注解的流行,Mybatis提供了 注解的方式,使得我们方便的在接口上编写节点的数据库SQL操作代码,而无需像之前一样,必须编写SQL在XML格式的Mapper文件中。虽然说大部分情况下,都还是喜欢在XML格式的Mapper文件中编写响应的SQL操作
异常模块
  • 对应exceptions
  • 定义了Mybati专有的 PersistenceException 异常和 TooManyResultsException 异常
核心处理层
  • 在核心处理层中,实现了Mybatis的核心处理流程,其中包括Mybatis的 初始化以及完成一次 数据库操作的涉及的全部流程
配置解析
  • 对应buildermapping模块,前者为配置解析过程,后者主要为SQL操作解析后的映射
  • 在Mybatis初始化的过程中,会加载 mybatis-config.xml配置文件、映射配置文件以及Mapper接口中的注解信息,解析后的配置信息会自动形成相应的对象并保存到Configuration对象中
  • 节点(也就是ResultSet的映射规则)会被解析成ResultMap对象
  • 节点(也就是属性映射)会被解析成 ResultMapping对象
  • 之后利用该Configuration对象创建SqlSessionFactory对象,待Mybatis初始化之后,开发人员可以通过初始化得到SqlSessionFactory创建SqlSession对象并完成数据库操作
SQL解析
  • 对应scripting模块
  • 拼凑SQL语句是一件繁琐且容易出错的过程,为了将开发人员从这项枯燥无味的工作中解脱出来,Mybatis实现 动态SQL语句的功能,提供了多种动态SQL语句对应的节点。如:节点、节点、节点等。通过这些节点的组合使用,开发人员可以写出几乎满足所有需求的动态SQL语句
  • Mybatis中的 scripting 模块,会根据用户传入的实参。解析映射文件中定义的动态SQL节点。并形成数据库可执行的SQL语句。之后会处理SQL语句中的占位符,绑定用户传入的实参
SQL执行
  • 对应executorcursor模块,前面对应 执行器,后者对应执行 结果的游标
  • SQL语句的执行设计到多个组件,其中比较重要的是Executor、StatementHandler、ParameterHandler和ResultSetHandler
  • Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作的维托给StatementHandler完成
  • StatementHandler 首先通过 ParameterHandler完成SQL语句的实参绑定,然后通过 java.sql.Statement对象执行SQL语句,并得到结果集。最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回
  • 整体过程如下

1598944478066

插件层
  • 对应 plugin 插件
  • Mybatis自动提供的功能虽然强大,但是并不能完美切合所有的引用场景,因此Mybatis提供了插件接口,我们可以添加用户自定义的插件的方式对Mybatis机进行拓展。
  • 用户自定义插件也可以改变Mybatis的默认行为,例如,我们可以拦截SQL语句并对其进行重新
  • 由于用户自定义插件会影响Mybatis的核心行为,在使用自定义插件之前,开发人员需要了解Mybatis内部的原理,这样才能编写出安全、高效的插件
接口层
核心接口层
  • 对应session模块
  • 接口层相对简单,其核心就是SqlSession接口,该接口中定义了Mybatis暴漏给应用程序调用的API,也就是上层应用于Mybatis交互的桥梁
  • 接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作
其他层
JDBC模块
  • 对应 jdbc
  • JDBC 单元测试工具类
Lang模块
  • 对应 lang

总结

  • 总体简单,见名知意
1
https://gitee.com/icanci/Java-Review.git
git@gitee.com:icanci/Java-Review.git
icanci
Java-Review
Java-Review
master

搜索帮助