mybatis延迟加载的深入理解

什么是延迟加载

十年的七台河网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整七台河建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“七台河网站设计”,“七台河网站推广”以来,每个客户项目都认真落实执行。

延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去加载从信息。代码中有查询语句,当执行到查询语句时,并不是马上去DB中查询,而是根据设置的延迟策略将查询向后推迟。

什么时候会执行延迟加载

配置之后在对关联对象进行查询时使用延迟加载。

延迟加载策略

直接加载

遇到代码中查询语句,马上到DB中执行select语句进行查询。(这种只能用于多表单独查询)

侵入式延迟加载

将关联对象的详情(具体数据,如id、name)侵入到主加载对象,作为主加载对象的详情的一部分出现。当要访问主加载对象的详情时才会查询主表,但由于关联对象详情作为主加载对象的详情一部分出现,所以这个查询不仅会查询主表,还会查询关联表。

深度延迟加载

将关联对象的详情(具体数据,如id、name)侵入到主加载对象,作为主加载对象的详情的一部分出现。当要访问主加载对象的详情时才会查询主表,但由于关联对象详情作为主加载对象的详情一部分出现,所以这个查询不仅会查询主表,还会查询关联表。

使用延迟加载的目的

减轻DB服务器的压力,因为我们延迟加载只有在用到需要的数据才会执行查询操作。

如何开启延迟加载功能

Mybatis的延迟加载功能默认是关闭的

需要在SqlMapConfig.xml文件中通过setting标签配置来开启延迟加载功能

开启延迟加载的属性:

  • lazyLoadingEnabled:全局性设置懒加载。如果设为‘false',则所有相关联的都会被初始化加载。默认为false
  • aggressiveLazyLoading:当设置为‘true'的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。默认为true

配置

  
    
    
    
  

我们用关联查询来实现延迟加载,假设我们现在要查出用户和用户角色。

首先我们在user中添加查询userVo的方法和xml。



....

    
    
    
    
  
  
    
    
  
  
  id, `name`, age, role_id
 
  
...
  
  
  
  
...  
  
  
  
 
 
  id, role_name
 
 
... 

测试用例

@RunWith(SpringRunner.class)
@SpringBootTest
public class BaseMapperApplicationTests {
  @Autowired
  private UserMapper userMapper;

  @Autowired
  private RoleMapper roleMapper;

  @Test
  public void getUserVo() {
    System.out.println(userMapper.getUserVo("12312232"));
//    System.out.println(userMapper.getUserById("12312232"));
//    System.out.println(roleMapper.getRoleById(1));

  }
}

输出结果:

UserVo{user=User [Hash = 1937575946, id=12312232, name=哇哈哈啊娃哈哈哇哈哈哈哈哈哈哈, age=48, roleId=1, serialVersionUID=1], role=Role [Hash = 317053574, id=1, roleName=admin, serialVersionUID=1]}

注意

许多对延迟加载原理不太熟悉的朋友会经常遇到一些莫名其妙的问题:有些时候延迟加载可以得到数据,有些时候延迟加载就会报错,为什么会出现这种情况呢?

MyBatis 延迟加载是通过动态代理实现的,当调用配直为延迟加载的属性方法时, 动态代理的操作会被触发,这些额外的操作就是通过 MyBatis 的 SqlSessio口去执行嵌套 SQL 的 。由于在和某些框架集成时, SqlSession 的生命周期交给了框架来管理,因此当对象超出SqlSession 生命周期调用时,会由于链接关闭等问题而抛出异常 。 在和 Spring 集成时,要确保只能在 Service 层调用延迟加载的属性 。 当结果从 Service 层返回至 Controller 层时, 如果获取延迟加载的属性值,会因为 SqlSessio口已经关闭而抛出异常 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。


当前文章:mybatis延迟加载的深入理解
文章路径:http://myzitong.com/article/pjihgo.html