posts - 156,  comments - 601,  trackbacks - 0

    对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能,应该很同学都有听说过,今天主要与大家一起来解读一下MybatisLazy Load功能的实现的代码。Lazy Load实现的功能很好理解,就是在数据与对象进行Mapping操作时,只有当真正使用该对象时,才进行Mapping操作,以减少不必要的数据库查询开销,从而提升了程序的效率。

   首先就从配置部分讲起。(本文以Mybatis-3.0.5版本的源代码进行分析)

   在配置SqlSessionFactoryBean时,需要指定configLocation 属性,需要设置Mybatis Configuration对象的配置信息,其中有一个配置项目名为lazyLoadingEnabled的设置属性,就是用来开启或关闭MybatisLazy Load功能。默认设置是 false.  可以看一下 sqlmap-config.xml文件内容。


Sqlmap-config.xml 文件在SqlSessionFactoryBean 初始化后,解析并加载到 org.apache.ibatis.session.Configuration 该对象上


Configuration类的setLazyLoadingEnabled 方法的实现上,还可以很清楚的分析,Mybatislazy load功能是需要借助Cglib的代理功能来实现的。



接下来,根据之前给大家讲Lazy Load的意义时,提供其解决的数据与对象进行Mapping操作时加载优化,那就找到了出现,只要找到Mybatis是如何对数据集与BO对象进行Mapping操作的实现,就应该可以定位与这个属性是如何来启动Lazy Load功能。

Mybatis Mapping操作都是由 org.apache.ibatis.executor.resultset.ResultSetHandler接口的handleResultSets方法来完成的。而且Mybatis只有一个类实现了这个接口 FastResultSetHandler.下面的分析方向很明确了,直接分析一下FastResultSetHandlerhandleResultSets方法

下面就可以直接找到实现的代码重点,FastResultSetHandler 提供一个方法,来实现一行记录转成对象的功能。



createResultObject方法

 



   从上面的代码,可以很明确的发现 ResultObjectProxy.createProxy 是对BO对象进行的代理实现. 最后只要找到代理的回调实现(Callback),就可以分析出最终的Lazy Load的实现功能。里面的分析定位过程就不讲了,最终会找到EnhancedResultObjectProxyImpl类。其intercept方法,就是我们要分析的最终实现的代码。当BO对象的方法被调用时,就会触需要实施是否进行Lazy Load方式的加载。



 

lazyLoader.size() 保存需要延迟加载属性列表的个数。

lazyLoader.loadAll 就会触发ResultLoaderloadResult方法完成数据的加载实现。

 

至此Mybatis的整个Lazy Load的功能介绍就到此了。总结一下,其实现的原理就是对BO对象,借助Cglib工具,对BO对象进行增强。然后在使用BO时,进行即时的检测,来完成数据的加载实现。

 

Good Luck!

Yours Matthew!

posted on 2011-12-29 19:14 x.matthew 阅读(5001) 评论(1)  编辑  收藏 所属分类: Spring|Hibernate|Other framework

只有注册用户登录后才能发表评论。


网站导航: