Mybatis Laz-Load功能实现代码赏析(原创)
对于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文件内容。

在 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时,进行即时的检测,来完成数据的加载实现。
Mybatis Laz-Load功能实现代码赏析(原创)的更多相关文章
- Eclipse 使用mybatis generator插件自动生成代码
Eclipse 使用mybatis generator插件自动生成代码 标签: mybatis 2016-12-07 15:10 5247人阅读 评论(0) 收藏 举报 .embody{ paddin ...
- Uboot优美代码赏析1:目录结构和malkefile分析
Uboot优美代码赏析1:目录结构和malkefile分析 关于Uboot自己选的版本是目前最新的2011.06,官方网址为:http://www.denx.de/wiki/U-Boot/WebHom ...
- java web实现 忘记密码(找回密码)功能及代码
java web实现 忘记密码(找回密码)功能及代码 (一).总体思路 (二).部分截图 (三).部分代码 (一).总体思路: 1.在 找回密码页面 录入 姓名.邮箱和验证码,录入后点击[提交]按钮, ...
- 国际C语言混乱代码大赛代码赏析(一)【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/9073869 国际C语言混乱代码大赛代码赏析(一) 近段时间在看<C专家编程& ...
- 通过.NET实现后台自动发送Email功能的代码示例
原文:通过.NET实现后台自动发送Email功能的代码示例 通过.NET实现后台自动发送邮件功能的代码,可以将一些基础信息放到web.config文件中进行保存: Web.config文件信息段: & ...
- 用Eclipse的snippets功能实现代码重用
snippets功能实现代码重用 Snippets 代码片段是Eclipse的一个插件. 很多时候可以通过这个功能,重复使用常用的代码片段,加快开发效率. 创建一个代码段的步骤: 在Eclipse的e ...
- MyBatis:CRUD功能
在前面已经自动生成了mapper和pojo,接下来我们实现mybatis的CRUD功能,先新建service.controller层的方法. 这里的sid是一个开源的id生成类,写完后,我们还需要在启 ...
- 02 使用Mybatis的逆向工程自动生成代码
1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...
- 使用@selector模仿代理功能降低代码耦合度
使用@selector模仿代理功能降低代码耦合度 说明 该模式的好处就是两个产生联系的对象间并没有具体的耦合代码,增删改查均很直观 源码 Model // // Model.h // SELMetho ...
随机推荐
- INSPIRED启示录 读书笔记 - 第16章 市场调研
常用的市场调研工具和方法 用户调查:第一,设计调查问卷需要技巧和经验,不是一件容易的事:第二,调查结果为获得解决方案提供了一要途径,但不是解决方案本身 产品使用分析:使用分析工具记录用户使用产品的行为 ...
- 斯坦福机器学习视频笔记 Week8 无监督学习:聚类与数据降维 Clusting & Dimensionality Reduction
监督学习算法需要标记的样本(x,y),但是无监督学习算法只需要input(x). 您将了解聚类 - 用于市场分割,文本摘要,以及许多其他应用程序. Principal Components Analy ...
- matplotlib柱状图
import numpy as np import matplotlib.pyplot as plt size = 5 a = np.random.random(size) b = np.random ...
- demo(幸福大转盘)总结
百度推广首页demo 在<head>与</head>之间加入代码 <link rel="shortcut icon" href="favic ...
- C++初始化小问题
#include<; } 发现,没有对string进行初始化,就已经默认可以使用,并且是空串,一直用java,对c++不熟悉.搜索了下,发现在c++中,只要对对象进行了定义,如果没有初始化,就会 ...
- Left Join ,On Where
SQL语句如下: SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff' WHERE 表1.NAME != 'aa' 步骤 ...
- 返回结果的HTTP状态码
HTTP状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果. 2xx成功 2xx的响应结果表明请求被正常处理. 200 OK 请求已正常处理 204 No Content 请求处理成功,但是 ...
- Javascript-理解事件总结
事件 [事件流]表述的是从页面接收事件的顺序.1.事件冒泡流:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档).所有浏览器都支持.2.事件捕获:与事件冒泡相反,事件捕获的用意在 ...
- L118
The company needs to focus on its biggest clients.This article discussed the events that led to her ...
- New Concept English three (51)
22 76 Predicting the future is notoriously difficult. Who could have imagined, in the mid 1970s, for ...