首页 > 代码库 > mybatis之XML解析源码分析

mybatis之XML解析源码分析

一直想知道mybatis是如何解析xml文件的,今天认真看了下源码,这里记录一下

这里是用mybatis-springSqlSessionFactoryBean当作的入口,mybatis-spring其实很简单,源码也就几个看看就懂了,代理了一下而已没啥东东.

1.解析spring的配置

不过很多参数都是spring中来处理了,所以mybatis-spring没有先parse而是先加载了配置文件

依次是

  1. typeAliasesPackage
  2. typeAliases
  3. Plugins
  4. typeHandlersPackage
  5. typeHandlers

typeAliases

相当于加载了上面的typeAliases,plugins,typeHandlers

然后typeAliases putTYPE_ALIASES供查询时调用类型转换

Plugins

拦截器也private final List<Interceptor> interceptors = new ArrayList<Interceptor>();

这里用的ArrayList所以是自顶向下按照顺序执行的

typeHandlers

Typehandler 也是putprivate final Map<Class<?>, Map<JdbcType, TypeHandler>> TYPE_HANDLER_MAP = new

HashMap<Class<?>, Map<JdbcType, TypeHandler>>();到时候使用

 

2.解析我们自己配置的configLocation.xml

技术分享

 

解析的内容,内容和前面已经后面雷同这里就不多说了

技术分享

3.生成环境变量,貌似作用不大-因为都被spring接管了哈

技术分享

4.解析sql文件!重点来了

技术分享

依次是命名空间,缓存,parameterMap貌似没啥用了这个,resultMap重点,复用sql,执行sql

技术分享

命名空间就不说了

4.1缓存创建

缓存是根据命名空间来做的,每个命名空间new一个缓存

技术分享

cachemybatis也比较简单先用map实现一个PerpetualCache,然后用装饰器模式,弄一堆缓存,包括LRU,Fifo,Scheduled等带有附加功能的缓存,其实调用的还是PerpetualCache,默认的是LRU,说一下LRU实现及其简单,是用的LinkedHashMap访问排序功能,简易实现了,然后后面的sql就会调用了,这里显示下cacheKey的生成

技术分享

用了很多条件确保了key的唯一性

4.2resultMap

4.2.1解析一下简单参数

技术分享

 

4.2.1ResultMapping 其实就是我们写的resultjava对象

技术分享

然后解析xml把值配置到对象中

技术分享

4.2.4这些参数以及这个list组合成为一个resultMap

技术分享

4.3重复的sql

这个简单直接put

技术分享

4.4执行sql

首先是设置一堆属性

技术分享

通过一系列的hanlder把动态xml解析

技术分享

然后拼装成为

技术分享

这个对象是及其重要的,基本上包含了一个sql的所有信息,之后查询的时候就可以根据这个信息来进行反射set对象了

 

到这里mybatis也基本上初始化完成了

mybatis之XML解析源码分析