深入了解 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的总结结构:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值