转载

MyBatis 源码解析(序)

之前在接触 MyBatis 的时候,就觉得这个技术的思想很新颖,要实现这些功能并不难,但是如何实现,以及 MyBatis 的整体架构却是我远远不及的。

Mybatis 作为一个半自动化 ORM 框架,同时具有灵活性和方便性,因此在国内各个大厂都十分受欢迎,如果让我自己实现这样一个框架,我可能会首先想到以下几块:

  • XML 解析模块,整个框架都是通过 XML 进行描述配置的,因此需要首先封装一个 XML 解析,可以考虑在 Tomcat 中发现的 Digester 来直接将 XML 解析为对象
  • 全局配置,配置是全局最重要的一部分,我会设计为单例的,这样无论什么地方都能方便的读取配置。

  • SQL 配置, SQL 配置包含了对各个 Mapper 以及 Java 接口的一一映射, SQL 配置的解析我可能会在启动的时候都完全解析成 JDBC 需要的 SQL 样式,比如将参数改为 ?
  • SQL 执行, SQL 执行为具体执行 SQL 的时候的处理,包括几个小模块,比如结果处理,参数映射等
  • 其他,还有其他的非核心功能,比如反射可能需要封装成工具类,还有各大框架都离不开的 SLF4J 日志框架,便于其他系统集成等

当我概览了 MyBatis 的源码之后,发现我还是比较年轻,毕竟一个好的框架被广泛使用的时候,就会涉及到各种不同的需求,比如动态 SQL ,比如参数类型映射,比如连接池,延迟加载等等,,

MyBatis 依然将这些功能非常优雅的实现了。

MyBatis 模块分析

这里,我们先简单的划分一下 MyBatis 的功能模块。

配置解析

MyBatis 使用的是 Configuration 类来映射整个 MyBatis 的配置, Configuration 的生成是通过 SqlSessionFactoryBuilder 解析,使用的是 JDK 中的 DOM 接口,这里 MyBatis 并没有使用单例实现 Configuration ,原因如下:

Configutation
Configuration

不过 MyBatis 中几乎所有的代码都会访问 Configuration ,因此几乎所有的对象的构造方法都会带有 Configuration 参数,这样看起来也是比较繁琐的

SQL 执行

MyBatis 中, SQL 的执行都是通过 Executor 完成,其主要提供了:

  • 增删查改等功能
  • 事务的提交,回滚等
  • 缓存
  • 延迟加载
  • 对数据结果的处理

参数映射

MyBatis 提供了可自己配置的参数映射,主要用来解决一些类似枚举的特殊情况,其主要接口为 TypeHandler

反射

MyBatis 的核心便是通过反射给对象赋值以及动态代理调用方法,因此对反射的使用十分频繁,在 MyBatis 中,通过 ResultMap 定义的对象都会被封装为 ObjectWrapper ,便于方便的调用 Setter/Getter 方法。

总的来说, MyBatis 的结构设计看着十分优雅,非常值得一学。

这里补上一张 MyBatis 的总结结构:

MyBatis 源码解析(序)

图片来源: https://www.cnblogs.com/mengheng/p/3739610.html

参考链接:

MyBatis架构设计及源代码分析系列(一):MyBatis架构
原文  http://dengchengchao.com/?p=1161
正文到此结束
Loading...