常见问题 mybatis延迟、立即加载的概念与区别

概念

  • 延迟加载
    • 也称为懒加载,是指在需要使用关联对象时才进行加载。比如在多表关联查询中,对于主表数据和关联的子表数据,当只查询主表数据时,不会立即加载关联的子表数据。只有当程序实际访问到子表数据相关的属性或方法时,MyBatis 才会发送额外的 SQL 查询去加载子表数据。这样可以避免在不需要关联数据时进行不必要的查询,提高系统性能,减少资源浪费,尤其在处理大量数据或复杂关联关系时效果明显。
  • 立即加载
    • 又称为 eager loading,与延迟加载相反,是指在查询主对象时,会立即加载与其关联的所有对象。即在执行查询操作时,通过 SQL 的关联查询(如 JOIN 操作),一次性将主表和关联表的数据都查询出来,并封装到相应的对象中。无论后续是否会使用到关联对象的数据,都会在查询主对象时一并加载,好处是可以减少后续访问关联数据时的查询次数,在某些场景下能提高数据访问的效率。

区别

  • 加载时机
    • 延迟加载:在真正使用关联对象数据时才加载,是一种按需加载的方式。
    • 立即加载:在查询主对象的同时立即加载关联对象,不管是否马上使用关联数据。
  • SQL 执行次数
    • 延迟加载:可能会根据访问关联数据的次数产生多次 SQL 查询。如果一个主对象关联多个子对象,且每次只访问部分子对象数据,那么只有在访问每个子对象时才会执行相应的查询,可能会有多次数据库交互。
    • 立即加载:通常只需要一次 SQL 查询,通过一次关联查询就能获取主对象和关联对象的所有数据,减少了数据库的交互次数。
  • 内存占用
    • 延迟加载:在没有访问关联数据时,不会占用额外的内存来存储关联对象,只有在加载关联数据时才会占用相应内存,能更有效地利用内存资源,尤其在处理大量数据且只需要部分关联数据的情况下,内存压力较小。
    • 立即加载:由于一次性加载了主对象和关联对象的数据,会在内存中同时存储这些数据,可能会占用较多的内存空间,在处理大量数据和复杂关联关系时,内存占用可能会成为一个问题。
  • 应用场景
    • 延迟加载:适用于关联数据不是每次都需要使用,且希望减少不必要的数据库查询和内存占用的场景。如在展示一个包含大量订单的列表时,订单的详细商品信息可能不需要立即显示,此时可以使用延迟加载,当用户点击查看订单详情时再加载商品信息。
    • 立即加载:适用于对关联数据的访问比较频繁,且希望减少查询次数以提高性能的场景。比如在查询一个用户信息时,总是需要同时获取该用户的所有角色信息,使用立即加载可以在一次查询中获取所有需要的数据,避免多次查询带来的性能开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值