首页 > 代码库 > mybatis之XML解析源码分析
mybatis之XML解析源码分析
一直想知道mybatis是如何解析xml文件的,今天认真看了下源码,这里记录一下
这里是用mybatis-spring的SqlSessionFactoryBean当作的入口,mybatis-spring其实很简单,源码也就几个看看就懂了,代理了一下而已没啥东东.
1.解析spring的配置
不过很多参数都是spring中来处理了,所以mybatis-spring没有先parse而是先加载了配置文件
依次是
- typeAliasesPackage
- typeAliases
- Plugins
- typeHandlersPackage
- typeHandlers
typeAliases
相当于加载了上面的typeAliases,plugins,typeHandlers
然后typeAliases put到TYPE_ALIASES供查询时调用类型转换
Plugins
拦截器也private final List<Interceptor> interceptors = new ArrayList<Interceptor>();
这里用的ArrayList所以是自顶向下按照顺序执行的
typeHandlers
Typehandler 也是put到private 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一个缓存
cache中mybatis也比较简单先用map实现一个PerpetualCache,然后用装饰器模式,弄一堆缓存,包括LRU,Fifo,Scheduled等带有附加功能的缓存,其实调用的还是PerpetualCache,默认的是LRU,说一下LRU实现及其简单,是用的LinkedHashMap访问排序功能,简易实现了,然后后面的sql就会调用了,这里显示下cacheKey的生成
用了很多条件确保了key的唯一性
4.2resultMap
4.2.1解析一下简单参数
4.2.1ResultMapping 其实就是我们写的result的java对象
然后解析xml把值配置到对象中
4.2.4这些参数以及这个list组合成为一个resultMap
4.3重复的sql
这个简单直接put到
4.4执行sql
首先是设置一堆属性
通过一系列的hanlder把动态xml解析
然后拼装成为
这个对象是及其重要的,基本上包含了一个sql的所有信息,之后查询的时候就可以根据这个信息来进行反射set对象了
到这里mybatis也基本上初始化完成了
mybatis之XML解析源码分析