在开篇之前,首先自我介绍一下,我是一位来自沪漂的程序猿,目前在上海一家互联网保险公司担任JAVA高级工程师一职位,我的业余爱好是研究底层源码,我学习源码的方式简单除暴,直接Git拉下来,一行一行去斟酌,目前已经研究了Spring-Netty-Dubbo-Mybatis等几大框架源码,我看市面上的源码讲解博客比较浅,所以将自己的所领悟到的知识传达给大家,也希望大家提供宝贵的意见,相互学习,相互成长。
众所皆知,Mybatis是一个ORM框架,ORM框架是用来干嘛来的?Object Relation Mapping对象关系映射框架,框架的设计理念就是为了简化开发者的开发工作,将一些基础的操作利用一些设计模式和底层技术封装起来去服务于开发者,使得开发者基于利用框架的一些设计来规范开发代码,使得代码更利于服务。在接触Mybatis之前,我们最早接触的应该是Hiberate框架,但是现在已经消失在我们现实开发中,之所Mybatis能战胜Hiberate一直坚挺到现在,是因为Mybatis在性能方面优于Hiberate。Mybatis底层封装的还是原生Jdbc,无论什么样的ORM框架,都离不开JDBC。那么废话不多说,直奔主题。
我学习Mybatis的思路是从Configuration这个基础类来慢慢衍生开来的。这个类主要用来配置Mybatis的一些配置,我在这里挑几个核心属性来讲解
cacheEnabled:二级缓存开启配置
localCacheScope:一级缓存作用域配置,Statement(每次执行清除以及缓存),Session(每个Session共用一个本地缓存)
mapperRegistry:这是一个存储我们声明的Mapper接口的代理对象类,里面其实维护的就是一个Map
interceptorChain:这个类就是基于动态代理来实现Mybatis的拦截器模式
typeHandlerRegistry:维护的是我们对应的Class类,JDBC类型的转换器
TypeAliasRegistry:别名注册中心,维护的是类与别名之间的关系,也是基于Map实现
LanguageDriverRegistry:从名字上看就是语言驱动注册中心,其实大体上意思也差不多,这个类内部维护的其实就是LanguageDriver对象,那么LanguageDriver主要是用来将一些动态将本通过一些规则解析适配成原生sql。后面会着重讲到。
mappedStatements:这个类维护的就是我们所有的Mapper接口里面的方法集合,一个方法对应一个MappedStatement,其中这个Map的key就是我们声明在xml中的namespace+操作标签Id名。比如namespace为com.demo.mybatis.UserMapper,<select id="findById"></select>这样相对应的key就为com.demo.mybatis.UserMapper.findById
resultMaps:这个属性维护的也是一个Map,value主要是我们在xml里面声明的<ResultMap>标签,key也是namespace+id
parameterMaps:这个属性看名字也是知道,和上面的resultMaps属性差不多,这个维护的是我们声明的<ParameterMap>标签,key也是namespace+id
sqlFragments:维护的是我们在XML中声明的<sql>标签声明的sql片段,这个Map存放的是节点实例(XNode)
大概属性就讲到这里,后面漏掉的再做补充,我们接下来画一下Mybatis的组件图:
Configuration
XmlMapperBuilder:解析声明的XML文件
XmlStatementBuilder:将操作标签<Select> <Insert>解析成上面的我们讲到的MappedStatement实例
XmlScriptBuilder:用来解析操作标签下的子标签,转换成原生Sql
ResukltMap:Xml文件声明的<ResultMap>
ParameterMap:Xml文件声明的<ParameterMap>
MapperProxyFactory:对Mapper接口生成代理对象工程
MapperProxy:由MapperProxyFactory创建出来的实例,对应的代理对象的实现就是由这个类来完成的。
SqlSessionFactory:会话管理工厂
SqlSession:创建会话,也就是获取代理对象的入口对象
时间有限,持续更新中。。。。。
网友评论