1.什么是延迟加载当加载用户信息时不一定就要马上加载他的订单信息或者所有的好友信息聊天记录等等这样就需要用到延迟加载。当我们需要用到数据的时候才进行加载不用数据的时候就不加载也可以叫做懒加载。优点先从单表查询需要时再从关联表去关联查询⼤⼤提⾼数据库性能因为查询单表要比关联查询多张表速度要快。缺点因为只有当需要用到数据时才会进行数据库查询这样在大批量数据查询时因为查询工作也要消耗时间所以可能造成⽤户等待时间变长造成用户体验下降。在多表中一对多多对多通常情况下采用延迟加载一对一多对一通常情况下采用立即加载注意延迟加载是基于(嵌套查询)来实现的2.实现局部延迟加载在association和collection标签中都有⼀个fetchType属性通过修改它的值可以修改局部的加载策略。?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd !--命名空间方便隔离-- mapper namespacecom.lazyload.mapper.IAccountMapper !--将Account的信息和User的信息封装到ResultMap中去-- !-- property表示java实体类中属性的名称javaType表示属性的类型ofType表示泛型column表示应用查询的某列 select表示需要执行的sql语句 fetchType表示是否开启延迟加载eager取消延迟加载lazy开启延迟加载默认开启 -- resultMap iduserAccountMap typecom.lazyload.entites.Account id propertyid columnid/id result propertyuid columnuid/result result propertymoney columnmoney/result !--一对一的映射关系配置封装的内容 select属性指定的内容查询用户的唯一标识【com.itheima.dao.IAccountMapper方法名就是接口中的】 column属性指定的内容根据id查询时所需要的参数的值根据id来查询数据库的 -- association propertyuser columnuid javaTypecom.lazyload.entites.User selectfindAccountByUid feetchTypelazy/association /resultMap !--封装的查询所有-- select idfindAllAccount resultMapuserAccountMap select * from account /select !--根据用户id查询账户列表-- select idfindAccountByUid parameterTypeinteger resultTypecom.lazyload.entites.Account select * from account where uid#{uid} /select /mapper?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd !--命名空间方便隔离-- mapper namespacecom.lazyload.mapper.IUserMapper !--写入user的resultMap:将user和数据库对应 作用建立SQL查询结果字段与实体属性的映射关系 -- resultMap iduserAccountMap typecom.lazyload.entites.User !--主键字段-- !--column所表示的是数据库中的字段名称-- id propertyid columnid/id !--非主键字段-- result propertyusername columnusername/result result propertybirthday columnbirthday/result result propertysex columnsex/result result propertyaddress columnaddress/result !--Userx下对应的对应Account账户的信息:配置user对象下account的映射-- collection propertyaccounts selectfindUserById columnid/collection /resultMap !--查询所有-- select idfindAll resultMapuserAccountMap select * from user /select !--查询一个通过id-- select idfindUserById parameterTypeint resultTypecom.lazyload.entites.User select * from user where id#{id} /select /mapper 参考链接:https://blog.csdn.net/friggly/article/details/124686876?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-124686876-blog-108432460.235^v38^pc_relevant_default_basespm1001.2101.3001.4242.1utm_relevant_index3当查询用户基本信息时只返回用户基本信息而不进行其余账号信息的查询当触发关键方法的时候才进行查询具体的进入参考链接学习讲的非常好到位学习链接。全局延迟加载#全局启用延迟加载 mybatis.configuration.lazy-loading-enabletrue #为false时所有关联对象都会按需求加载 mybatis.configuration.aggressive-lazy-loadingfalse #设置方法触发加载,不设置时默认为下面这几个方法触发 mybatis.configuration.lazy-load-trigger-methodsequals,clone,hashCode局部加载策略优先级高于全局加载策略同时在xml映射文件里修改feetchType属性为eager来取消延迟加载。3、延迟加载原理实现它的原理是使用 CGLIB 或 Javassist( 默认 ) 创建目标对象的代理对象。当调用代理对象的延迟加载属性的 getting 方法时进入拦截器方法。比如调⽤ a.getB().getName() 方法进入拦截器的invoke(...) 方法发现 a.getB() 需要延迟加载时那么就会单独发送事先保存好的查询关联 B对象的 SQL 把 B 查询上来然后调用a.setB(b) 方法于是 a 对象 b 属性就有值了接着完成a.getB().getName() 方法的调用。这就是延迟加载的基本原理。总结延迟加载主要是通过动态代理的形式实现通过代理拦截到指定方法执行数据加载。