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 ...
随机推荐
- SpringBoot Mybatis keyProperty和useGeneratedKeys的作用
在使用mybatis时,常常会出现这种需求: 当主键是自增的情况下,添加一条记录的同时,其主键是不能被使用的(为空),但是有时我们需要该主键,这时我们该如何处理呢?这时我们只需要在其对应xml中加入以 ...
- UVA 796 连通图求桥
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=86270#problem/C#include<iostream> #inclu ...
- centos6 多段Ip添加脚本
#!/bin/bash export device=`ifconfig|grep eth0|head -n 1|awk '{print ($1)}'`export ipcfg_pre="/e ...
- WebUploader API文档
Web Uploader内部类的详细说明,以下提及的功能类,都可以在WebUploader这个变量中访问到. As you know, Web Uploader的每个文件都是用过AMD规范中的defi ...
- java中如何将非整数保留到小数点后指定的位数
- java深入探究08-连接池,分页
1.连接池 1)自定义连接池 思路:定义一个类Pool->添加4个属性(最大连接数,初始化连接数,当前连接数,用来存放连接对象的LinkList集合对象)->定义一个createConne ...
- js用星号隐藏电话中间四位号码
$(document).ready(function(){ var mobile="{$user.mobile}"; var reg=/^(\d{3})\d{4}(\d{4})$/ ...
- VMWARE TOOLS安装出错:THE PATH IS NOT A VALID PATH TO THE 3.11.0.12-GENERIC KERNEL HEADERS
VMWARE TOOLS安装提示THE PATH IS NOT A VALID PATH TO THE GENERIC KERNEL HEADERS I solved this problem, I ...
- Codeforces 895C Square Subsets:状压dp【组合数结论】
题目链接:http://codeforces.com/problemset/problem/895/C 题意: 给你n个数a[i].(n <= 10^5, 1 <= a[i] <= ...
- C++(十四) — 常用快捷键总结
快捷键设置方法:https://blog.csdn.net/wrzfeijianshen/article/details/53230789 https://blog.csdn.net/wrzfei ...