Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加 载,association 指的就是一对一,collection 指的就是一对多查询。
在 Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦 截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来, 然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName() 方法的调用。
这就是延迟加载的基本原理。 当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都 是一样的。
Mybatis延迟加载原理与配置详解
Mybatis的延迟加载特性允许在需要时才加载关联对象,如association的一对一和collection的一对多查询。通过配置lazyLoadingEnabled参数,可以开启或关闭此功能。其工作原理基于CGLIB动态代理,当尝试访问关联对象时,如果该对象为null,Mybatis会执行预存的SQL获取关联数据,然后设置到对象属性中,从而实现延迟加载。这一机制在Hibernate等ORM框架中也广泛应用。
980

被折叠的 条评论
为什么被折叠?



