欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Mybatis Laz-Load功能实现代码赏析(原创)

程序员文章站 2022-05-26 21:10:44
...

对于 Mybatis 拥有的 Lazy Load( 有中文翻译成延迟加载 ) 功能,应该很同学都有听说过,今天主要与大家一起来解读一下 Mybatis 在 Lazy Load 功能的实现的代码。 Lazy Load 实现的功能很好理解,就是在 数据与对象进行 Mapping 操作 时,只有当真正使用该对

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

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

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

Sqlmap-config.xml 文件在 SqlSessionFactoryBean 初始化后,解析并加载到 org.apache.ibatis.session.Configuration 该对象上 Mybatis Laz-Load功能实现代码赏析(原创)

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

Mybatis Laz-Load功能实现代码赏析(原创)

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

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

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


Mybatis Laz-Load功能实现代码赏析(原创)


createResultObject方法

Mybatis Laz-Load功能实现代码赏析(原创)

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

Mybatis Laz-Load功能实现代码赏析(原创)


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

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

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