MyBatis:lazy loading

懒加载的规律

mybatis
会循环处理结果集中重返的每行数据的,在拍卖在此以前率先会经过反射调用构造方法来创制result 对象,结果集中的一行数据最后会炫耀为一个 result
对象(严谨的来说是颠三倒四的,结果集中的一行数据在多表连接的情状下可能会炫耀为六个result
对象,结果集中的一行数据在多表连接一对多的境况下结果集中的多行数据也许映射一个
result 对象,简单的单表查询结果集中的一条龙数据映射为一个 result 对象)。

实质上在调用构造方法成立 result
对象的时候,构造方法还可能会有参数,需要先把结果集中的参数都领到出来,传给相应的构造方法通过反射成立对象。

mybatis 其实第一步是分析配置文件,把安排文件映射为 mybatis 的
Configuration 类,把部署文件的 xml 属性都映射为 Java 对象中的属性值。xml
mapper 文件的拍卖相比复杂,< resultMap/> 标签映射为 ResultMap
对象, 标签中的< id/> 、< result/>、< association/>
等映射为 ResultMapping 对象。

骨子里要讲 mybatis
的落实过程,涉及到的点太多了,没法在一篇博客中讲。在此地,我只简简单单的讲一下规律。

进而再讲创立好 result 对象之后,mybatis 会循环
resultMappings(标签中的每个子标签都映射为一个 resultMapping,这多少个resultMapping 组成了一个成团就是
resultMappings)集合,看有没有需要懒加载的性质,假若有的话,则会为这多少个result 对象创设一个代理对象。

怎样情况下才会并发需要懒加载的性质呢?只有 < association
property=”author” column=”author_id” select=”selectAuthor”
fetchType=”lazy”/> 
和 < collection property=”xxx” column=”xxx” select=”xxxx”
fetchType=”lazy”/> 作为一个子标签出现在 < resultMap/>
标签(也不自然只是 < resultMap/> 标签,< collection/>
等标签事实上也总算一个 < resultMap/>
标签)之内才会冒出需要懒加载的属性。select 属性和 fetchType=”lazy”
必须同时现身在 < collection/> 或 < association/>
属性中才需要懒加载,select 表示的是嵌套查询语句的 id ,fetchType=”lazy”
表示的是懒加载。

再跟着讲 result 对象的代理对象,代理类是由 javassist
框架在运作时创建和加载的,这一个代理类继承自 result
对象所属的类,以地点的例子为例,这一个代理类继承自 Blog 类。

对此这些代理类的详实讲解在自身的博客深切明白 Java
动态代理中有很详细的介绍,在这边自己再简单的牵线下。

其一代理类继承了 result
对象所属的类(被代理类)同等对待写了被代理类的装有的法子,所以在代理对象上调用懒加载属性的
get 方法(getAuthor())时会触发懒加载动作,mybatis
这时就能发现需要去懒加载一个属性,然后去加载那个特性。

实际,有多少个形式都足以触发懒加载的操作,比如调用懒加载的 get/set
方法(确实调用 set 方法时也会触发懒加载操作)还有调用
clone()、equals()、hashCode()、toString()方法也会触发懒加载操作,虽然代理对象有多少个懒加载属性,则调用前面的这六个章程时会同时触发加载所有的懒加载属性。

懒加载操作只会接触四次,下次再调用这么些艺术时不会重新触发懒加载操作的。

懒加载其实又是一回查询操作,懒加载查询需要传递一些参数,还有一部分其他标准。这个待传递的属性、参数、查询所需的
sql 语句等连锁的准绳都早已封装到了代理对象内部,这几个标准封装在一个 Map
中,键是懒加载查询的特性名称,值是询问该属性所需的原则,包括参数、sql
语句等。懒加载完一个性能之后会把这个特性从 Map
中移除,所以再一次启程懒加载操作时 mybatis
就明白该属性已经被被加载过了,不会重新加载。

懒加载也是一个挺复杂的进程,我在下面的执教中简单了广大,要一切讲出来涉及的事物太多。

本人再下结论一下,懒加载成效使用了代办对象,所以在调用懒加载属性的 get/set
方法(或者是任何触发懒加载操作的艺术)时 mybatis
才能知道这儿应该去加载懒加载属性。

 

 

ORM 框架hibernate 也是协助lazy 加载的,相信原理也是看似的。

网站地图xml地图