Mybatis是否支持延迟加载?
答:Mybatis支持延迟记载,但默认没有开启
什么叫做延迟加载?
查询用户的时候,把用户所属的订单数据也查询出来,这个是立即加载
查询用户的时候,暂时不查询订单数据,当需要订单的时候,再查询订单,这个就是延迟加载
只查询了用户,没有查询订单
全局延迟加载
底层实现
1. 使用CGLIB创建目标对象的代理对象
2. 当调用目标方法user.getOrderList()时,进入拦截器invoke方法,发现user.getOrderList()是null值,执行sql查询order列表
3. 把order查询上来,然后调用user.setOrderList(List<Order> orderList) ,接着完成user.getOrderList()方法的调用
面试回答
面试官:Mybatis是否支持延迟加载?
候选人: 是支持的, 延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时 就不加载数据。
Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载 在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false,默认是关闭的
面试官:延迟加载的底层原理知道吗?
候选人:延迟加载在底层主要使用的CGLIB动态代理完成的 第一是,使用CGLIB创建目标对象的代理对象,这里的目标对象就是开启了 延迟加载的mapper 第二个是当调用目标方法时,进入拦截器invoke方法,发现目标方法是null 值,再执行sql查询 第三个是获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了