小编给大家分享一下Mybatis查询延迟加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强> Mybatis查询延迟加载详解及实例强>
<强> 1.1,,,,启用延迟加载强>
,,,,,,Mybatis的延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来.Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来。<强>开启延迟加载有两种方式。强>
,,,,,,第一种是在对应的& lt; collection>或& lt; association>标签上指定fetchType属性值为“懒惰”。如下示例中我们在查询id为selectByPrimaryKey的查询时会返回BaseResultMap,在BaseResultMap中,我们指定了属性“节点”是一个集合类型的,而且是需要通过id为selectNodes的查询进行查询的,我们指定了该查询的fetchType为懒惰,即延迟加载。
,, & lt; resultMap id=癇aseResultMap",类型=癱om.elim.learn.mybatis.model.SysWfProcess"比; ,,& lt; id 列=癷d", jdbcType=癐NTEGER",财产=癷d",/比; ,,& lt; result 列=皌emplate_id", jdbcType=癐NTEGER",财产=皌emplateId",/比; ,,& lt; result 列=癱reator", jdbcType=癐NTEGER",财产=癱reator",/比; ,,& lt; result 列=癱reate_time", jdbcType=癟IMESTAMP",财产=癱reateTime",/比; ,,& lt; collection 财产=皀odes",列=癷d" ,,,减低=癱om.elim.learn.mybatis.model.SysWfNode",选择=皊electNodes", fetchType=發azy"/比; & lt;才能/resultMap> & lt;才能resultMap id=癝ysWfNodeResult",类型=癱om.elim.learn.mybatis.model.SysWfNode"比; ,,& lt; id 列=癷d", jdbcType=癐NTEGER",财产=皀odeId",/比; ,,& lt; result 列=皃rocess_id", jdbcType=癐NTEGER",财产=皃rocessId",/比; ,,& lt; result 列=皀ode_code", jdbcType=癡ARCHAR",财产=皀odeCode",/比; ,,& lt; result 列=皀ode_name", jdbcType=癡ARCHAR",财产=皀odeName",/比; & lt;才能/resultMap> & lt;才能select id=皊electByPrimaryKey", parameterType=癹ava.lang.Integer" ,,resultMap=癇aseResultMap"比; ,才能选择 ,,& lt; include  refid=癇ase_Column_List",/比; ,才能得到sys_wf_process ,,where id =, # {id, jdbcType=整数} & lt;才能/select> & lt;才能select id=皊electNodes" ,,resultMap=癝ysWfNodeResult"比; ,,select id, process_id,, node_code, node_name 得到sys_wf_node ,,where process_id=# {id} & lt;才能/select>
,,,,,,第二种是开启全局的延迟加载。通过在Mybatis的配置文件的& lt; settings>标签下加上如下配置可开启全局的延迟加载。开启了全局的延迟加载后我们就无需再在各个嵌套的子查询上配置延迟加载了,如果有某一个嵌套的子查询是不需要延迟加载的,可以设置其fetchType=翱释?设置在嵌套查询上的fetchType可以覆盖全局的延迟加载设置。
,,, & lt; setting name=發azyLoadingEnabled",值https://www.yisu.com/zixun/=" true "/>
<强> 1.2,,,,分析强>
,,,,,,Mybatis的查询结果是由ResultSetHandler接口的handleResultSets()方法处理的.ResultSetHandler接口只有一个实现,DefaultResultSetHandler。有兴趣的朋友可以去看一下它的源码,看一下它是如何处理结果集的。对于本文的主题,延迟加载相关的一个核心的方法就是如下这个创建返回结果对象的方法。
, private Object createResultObject (ResultSetWrapper rsw, ResultMap resultMap,, ResultLoaderMap lazyLoader,, String columnPrefix), throws SQLException { final 才能;List< Class<?在祝辞,constructorArgTypes =, new ArrayList, constructorArgs =, new ArrayList