之前在接触 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 使用的是 Configuration 类来映射整个 MyBatis 的配置, Configuration 的生成是通过 SqlSessionFactoryBuilder 解析,使用的是 JDK 中的 DOM 接口,这里 MyBatis 并没有使用单例实现 Configuration ,原因如下:
Configutation Configuration
不过 MyBatis 中几乎所有的代码都会访问 Configuration ,因此几乎所有的对象的构造方法都会带有 Configuration 参数,这样看起来也是比较繁琐的
MyBatis 中, SQL 的执行都是通过 Executor 完成,其主要提供了:
MyBatis 提供了可自己配置的参数映射,主要用来解决一些类似枚举的特殊情况,其主要接口为 TypeHandler
MyBatis 的核心便是通过反射给对象赋值以及动态代理调用方法,因此对反射的使用十分频繁,在 MyBatis 中,通过 ResultMap 定义的对象都会被封装为 ObjectWrapper ,便于方便的调用 Setter/Getter 方法。
总的来说, MyBatis 的结构设计看着十分优雅,非常值得一学。
这里补上一张 MyBatis 的总结结构:
图片来源: https://www.cnblogs.com/mengheng/p/3739610.html
参考链接:
MyBatis架构设计及源代码分析系列(一):MyBatis架构