MyBatis 的懒加载是指在实际需要使用关联对象的数据时才去查询并加载这些数据。在MyBatis中,懒加载主要应用于关联查询的场景,比如一对一、一对多或多对多的关系。
懒加载的原理是在第一次执行查询时,并不立即加载所有关联的对象,而是返回一个代理(Proxy)对象。当真正访问关联对象的属性时,才会触发真正的查询并加载数据。这种方式可以提高性能,特别是在某些关联数据不常被访问的情况下。
MyBatis 中懒加载的实现通常涉及以下几个步骤:
-
配置懒加载:在 MyBatis 的配置文件
mybatis-config.xml
中开启懒加载以及相应的懒加载触发方法。例如,可以设置lazyLoadingEnabled
为true
来启用懒加载,并设置aggressiveLazyLoading
为false
来防止在任何关联对象的属性被调用时就加载所有属性。 -
映射关联关系:在 Mapper XML 文件中配置关联关系,指定哪些属性需要懒加载。例如,在
<association>
或<collection>
标签中使用fetchType="lazy"
。 -
使用代理对象:MyBatis 使用 CGLIB 或 Javassist 等字节码增强技术创建关联对象的代理。当访问代理对象的方法时,代理逻辑会检查对应的数据是否已经加载。如果还没有加载,代理对象会执行实际的查询操作来加载数据。
-
触发懒加载:在执行业务代码时,当第一次访问代理对象的某个属性或方法时,MyBatis 会触发懒加载,执行必要的SQL查询并填充代理对象的数据。
-
加载数据:一旦触发懒加载,MyBatis 将调用相应的 Mapper 接口和 SQL 映射,执行数据库查询并获取数据。获取的数据随后填充到代理对象中,替换原来的懒加载占位。
-
缓存处理:MyBatis 也提供了缓存机制来避免重复加载同一数据。如果启用了二级缓存,那么在第一次懒加载后,数据将被缓存起来,之后的访问就不会再触发数据库查询。
懒加载是一种优化手段,它可以推迟数据加载的时间,减少不必要的数据库查询,从而提高应用程序的性能。然而,懒加载也可能导致 N+1
查询问题,如果不加以注意,可能会在遍历关联对象时产生大量的单独 SQL 查询。因此,使用懒加载时需要权衡利弊并谨慎设计关联查询的策略。