最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-09 14:04:01
文档

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

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

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

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

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

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

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

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



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

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

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



createResultObject方法



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



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

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

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

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

MybatisLaz-Load功能实现代码赏析(原创):对于 Mybatis 拥有的 Lazy Load( 有中文翻译成延迟加载 ) 功能,应该很同学都有听说过,今天主要与大家一起来解读一下 Mybatis 在 Lazy Load 功能的实现的代码。 Lazy Load 实现的功能很好理解,就是在 数据与对象进行 Mapping 操作 时,只有当真
推荐度:
标签: 功能 实现 代码
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top