1.概念

MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。

2.关联对象的加载时机

①.直接加载

执行完对主加载对象的select语句,马上执行对关联对象的select查询

②.侵入式延迟加载

执行对主加载对象的查询时,不会执行对关联对象的查询。但是当要访问主加载对象的详情时,就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情访问中。也可以这样理解:将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象详情的一部分出现了

③.深度延迟加载

执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象或关联对象详情时,才会执行对关联对象的select查询。

3.XML大配置

①.侵入式延迟(侵入式延迟默认为true,所以只要启动延迟就默认是侵入式延迟)

 <settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>

②.深度延迟(只需把侵入式延迟aggressiveLazyLoading设置为false)

 <settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

4.例子和测试

接口:

 package cn.sohappy.acourses.course0921;

 import cn.sohappy.acourses.bean.BillManyToOne;
import cn.sohappy.acourses.bean.UserOneToMany;
import cn.sohappy.bean.Smbms_user; import java.util.List; public interface IUserDAO { //03.oneToMany,多条sql查询,传入user,返回包含账单信息的user
UserOneToMany getUserOneToManyBillsMultiSQL(UserOneToMany user);
}

XML片段:

 <!--.oneToMany多条sql-->
<resultMap id="UserOneToManyBillsMultiSQL" type="cn.sohappy.acourses.bean.UserOneToMany" autoMapping="false">
<id property="id" column="id"/>
<result property="username" column="userName"/>
<!--select为第二条sql名,column为第一条sql结果中的字段名,其值作为第二条sql的条件-->
<collection property="bills" ofType="cn.sohappy.acourses.bean.BillManyToOne" select="selectBillsByUser" column="id"/>
</resultMap>
<select id="selectBillsByUser" resultType="cn.sohappy.acourses.bean.BillManyToOne">
select * from smbms_bill where createdBy=#{**}
</select>
<select id="getUserOneToManyBillsMultiSQL" resultMap="UserOneToManyBillsMultiSQL">
select * from smbms_user where userCode=#{usercode}
</select>

测试:

 public void onToManyMultiSQL(){
SqlSession session = MyBatisUtil.getSession();
IUserDAO mapper = session.getMapper(IUserDAO.class);
UserOneToMany user = new UserOneToMany();
user.setUsercode("zhangsan");
/*侵入式延迟aggressiveLazyLoading,加载主对象属性时才会发送第二条sql
* 深度延迟lazyLoadingEnabled,加载关联对象或关联对象属性时发送第二条sql*/
//深度延迟,此处只发一条sql.侵入式延迟,此处发一条sql,不延迟,此处发两条sql(既获取user信息又获取bill信息)
UserOneToMany userOneToMany = mapper.getUserOneToManyBillsMultiSQL(user);
//深度延迟,下行代码不发sql.侵入式延迟,下行代码将发送第二条sql(获取bill信息)
// System.out.println(userOneToMany.getId()+","+userOneToMany.getUsername());
//深度延迟,下行代码将发送第二条sql(获取bill信息)
List<BillManyToOne> bills = userOneToMany.getBills();
/*for (BillManyToOne item: bills) {
System.out.println(item.getId()+","+item.getBillcode()+"."+item.getProductname());
}*/
session.close();
}

最新文章

  1. Spring中的单例一二
  2. A strange lift
  3. 三、MongoDB的创建、更新和删除
  4. javascript实现数据结构:串--堆分配存储表示
  5. 射频识别技术漫谈(10)&mdash;&mdash;识别号的格式变化【worldsing笔记】
  6. Sql Server 2005 CLR实例
  7. Quartz集成springMVC 的方案二(持久化任务、集群和分布式)
  8. 周末苦逼码代码,为css3的强大所颤抖了
  9. Python网络编程——通过指定的端口和协议找到服务名
  10. 凡事预则立-于Beta冲刺前
  11. ping通windows下虚拟机上的linux系统
  12. js坚持不懈之11:focus()方法
  13. redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换
  14. java对象之----(PO,VO,DAO,BO,POJO)
  15. github个人心得和链接
  16. python re正则
  17. NodeJS+Express开发web,为什么中文显示为乱码
  18. WEB-WELCOME-FILE-LIST
  19. BZOJ3514: Codechef MARCH14 GERALD07加强版【LCT】【主席树】【思维】
  20. 一线工程师带你深入学习和使用Kubernetes

热门文章

  1. 细数 Windows Phone 灭亡的七宗罪(过程很详细,评论很精彩,但主要还是因为太慢了,生态跟不上,太贪了,厂商不愿意推广)
  2. Bootstrap 图片形状
  3. WPF 列表样式
  4. FileHelper
  5. adb help
  6. 微信小程序把玩(二十一)switch组件
  7. 零元学Expression Blend 4 - Chapter 5 2.5D转换的使用技巧
  8. Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio
  9. SQL Server上唯一的数据库集群:负载均衡、读写分离、容灾(数据零丢失、服务高可用)
  10. Failed to recover corrupt cache entry