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 ...
随机推荐
- FreeMarker 使用实例
以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... - ...
- 字符串问题之 去掉字符串中连续出现K个0的子串
字符串中刚好出现K个连续的‘O’,则把K个连续‘O’字符去除,返回处理后的字符串 比如 str="AOOOOOBOOO" k=3, 返回“AOOOOOB” 这个题的解决思路也有 ...
- mssql 函数STUFF 的用法
DECLARE @limitDay INT;SET @limitDay = 92;IF DATEDIFF(DAY, '2017-12-13 00:00:00', '2017-12-13 18:00:0 ...
- Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp
A. One-dimensional Japanese Crossword time limit per test 1 second memory limit per test 256 megabyt ...
- R语言可视化
R语言基础(一) 可视化基础 ##数据获取 x1=round(runif(100,min=80,max=100)) x2=round(rnorm(100,mean=80, sd=7)) x3=ro ...
- unity监测按下键的键值并输出+unity键值
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...
- msdn - Developer Library(包括wpf)重要程度——5星*****
https://msdn.microsoft.com/zh-cn/library/ms754242(v=vs.110).aspx https://msdn.microsoft.com/zh-cn/li ...
- Template、ItemsPanel、ItemContainerStyle、ItemTemplate(包括ListBox的Item子项是横向排列)
Template.ItemsPanel.ItemContainerStyle.ItemTemplate 分类: WPF2011-10-12 10:13 4716人阅读 评论(0) 收藏 举报 data ...
- hdu5692 dfs序线段树
这是补的知识点,按先序遍历的顺序建立dfs序,用左右两个值代表整个区间,因为dfs序最重要的特点就是子树的区间是连续的 建立线段树时,需要用重新标过的 下标来建立 #pragma comment(li ...
- poj2289二分图多重匹配
题意:给你一张二分图,求右边点到汇点的最小容量(保证流量为n)是多少 题解:二分答案,每次重新建边跑最大流,看是不是为n就好了 #include<map> #include<set& ...