文档章节

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

三毛々
 三毛々
发布于 2013/04/23 10:58
字数 711
阅读 215
收藏 4

    对于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 文件内容。


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 时,进行即时的检测,来完成数据的加载实现。

本文转载自:http://www.blogjava.net/xmatthew/archive/2011/12/29/367523.html

共有 人打赏支持
三毛々
粉丝 16
博文 56
码字总数 33881
作品 0
成都
私信 提问
MyBatis整合Spring的实现(1)

目的 MyBatis是一个基于Java的持久层框架。也是很多程序员的最爱,因为自己控制的SQL时,写出一个好的SQL会大大的提高整体程序的性能。目前的项目一般都是MyBatis和Spring的整合,那么具体的...

tara_qri
2015/10/24
332
0
Mybatis3.3.x技术内幕(七):Mybatis初始化之六个工具

全民欢庆的五一劳动节,可谓是赏花赏月赏秋香的好季节,炎炎夏日,柳絮飞扬,短裙飞舞,低胸抢镜,是旅游撩妹裸奔等精彩活动的不二选择,不过,这显然与我无关。 终于要开启Mybatis的初始化过...

祖大俊
2016/05/01
1K
5
JAVA实现编写平台代码生成器

[项目中经常写CRUD,但实际这些工作,我觉得如果有一个完整的代码规范,完全可以自动生成,加快开发效率. 代码生成器技术原理不复杂,一般就是写好一个模板生成一系列的代码而已。我看到myb...

爱余星痕
2018/04/13
0
0
MyBatis整合Spring的实现(7)

MyBatis整合Spring的实现(6)中分析了方法propertiesElement,下面继续往下分析代码: 1 方法typeAliasesElement private void typeAliasesElement(XNode parent) { if (parent != null) { ......

tara_qri
2015/10/26
0
0
Spring SpringMvc 3.0 + MyBatis 整合

原来发表在csdn的,移动到oschian Spring SpringMvc 3.0 + MyBatis 整合 一、使用的jar包就不详细讲解了,下载了Mybatis 和 Spring 的jar包基本上都添加上去了、 一图概括:(这是我使用的ar包...

王庭
2015/09/19
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

二进制取反

取反,是Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。 概念 编辑 补码的规定如下: 对正数来说,最高位为0,其余各位代表数值本身(以二进制表示)...

天王盖地虎626
今天
5
0
OSChina 周一乱弹 —— 可乐进化史

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 分享Radiohead的单曲《Creep》 《Creep》- Radiohead 手机党少年们想听歌,请使劲儿戳(这里) @EdmondFrank :刚...

小小编辑
今天
814
17
容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
5
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
25
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部