MyBatis 的延迟加载是怎么实现的?

MyBatis中的延迟加载是指,只有在需要使用对象的属性时,才去执行查询操作。

它的实现方式是:

  1. 在映射文件中,将属性配置为延迟加载。
<association property="address" 
   column="aid" 
   javaType="com.itzhimei.Address" 
   select="selectAddressById"  
   fetchType="lazy"/>  

这里的 fetchType=”lazy” 就表示延时加载。

  1. 当调用对象的属性时,MyBatis 才会执行查询。
User user = userMapper.getUserById(1);
String city = user.getAddress().getCity(); 
// 此时才会执行查询地址信息
  1. Mybatis 会触发 selectAddressById 这个查询,查询地址信息。

延迟加载的好处:

  1. 当不需要子属性时,可以避免无效的查询。提高效率。
  2. 可以避免查询出过多的结果集对象。
  3. 对于庞大的复杂对象,可逐步加载相关属性,减少内存占用。

上述都是基于 Mybatis 一级缓存实现的。

二级缓存需要注意:

  • 延迟加载的属性不会被二级缓存;
  • 需要显式加载延迟加载的属性,才会进入二级缓存。