资讯专栏INFORMATION COLUMN

mybatis 延迟加载

Xufc / 498人阅读

摘要:什么时候会执行延迟加载配置之后在对关联对象进行查询时使用延迟加载。在和集成时,要确保只能在层调用延迟加载的属性。当结果从层返回至层时,如果获取延迟加载的属性值,会因为口已经关闭而抛出异常。

mybatis 延迟加载
什么是延迟加载

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

什么时候会执行延迟加载

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

延迟加载策略
直接加载

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

侵入式延迟加载

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

深度延迟加载

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

使用延迟加载的目的

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

配置
    
        
        
        
    

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

首先我们在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口已经关闭而抛出异常 。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73029.html

相关文章

  • 通过项目逐步深入了解Mybatis(四)

    摘要:相关阅读通过项目逐步深入了解一通过项目逐步深入了解二通过项目逐步深入了解三本项目所有代码及文档都托管在地址延迟加载什么是延迟加载可以实现高级映射使用实现一对一及一对多映射,具备延迟加载功能。一级缓存是级别的缓存。 相关阅读: 1、通过项目逐步深入了解Mybatis 2、通过项目逐步深入了解Mybatis 3、通过项目逐步深入了解Mybatis 本项目所有代码及文档都托管在 Github...

    kuangcaibao 评论0 收藏0
  • Mybatis N+1问题解析

    摘要:问题解析因为热爱,所以拼搏。如何解决问题本身给出解决方案,就是延迟加载。延迟加载延迟加载会解决上述的问题,也就是在个级联表的情况下,只加载需求的数据库表数据。在特定的关联中,使用属性覆盖该内容的功能。 Mybatis N+1问题解析 因为热爱,所以拼搏。 --RuiDer 前导必备 Mybatis 数据库 级联 N+1问题?? N+1问题来源于数据库中常见的...

    qqlcbb 评论0 收藏0
  • JAVA面试题(29)

    摘要:本文首发于的博客转载请注明出处逻辑分页和物理分页的区别是什么分页是为了节省网络传输的数据量逻辑分页是将数据全部加载到内存,再通过后端逻辑控制分页显示到前端物理分页是在数据库层面分部分获取数据,通常情况下对内存的压力较逻辑分页少是否支持延迟加     本文首发于cartoon的博客    转载请注明出处:https://cartoonyu.github.io/c... Mybatis...

    junbaor 评论0 收藏0
  • Mybatis【配置文件】就是这么简单

    摘要:场合常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用将每一条记录映射到中,在前端页面遍历中是即可。如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。 配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装...

    freewolf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<