SSM(四)Mybatis延迟加载
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();
}
SSM(四)Mybatis延迟加载的更多相关文章
- Java基础-SSM之mybatis一对一关联
Java基础-SSM之mybatis一对一关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建husbands和wifes表并建 ...
- Java基础-SSM之mybatis多对多关联
Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...
- Java基础-SSM之mybatis一对多和多对一关系映射
Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建customers表: ...
- Java基础-SSM之mybatis的树形控件(自关联)
Java基础-SSM之mybatis的树形控件(自关联) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建areas表: use y ...
- Java基础-SSM之mybatis一对一外键关联
Java基础-SSM之mybatis一对一外键关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建husbandsfk和wife ...
- 【MyBatis】MyBatis 延迟加载策略
MyBatis 延迟加载策略 文章源码 什么是延迟加载 延迟加载,就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据,也被成为懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提 ...
- mybatis源代码分析:mybatis延迟加载机制改进
在上一篇博客<mybatis源代码分析:深入了解mybatis延迟加载机制>讲诉了mybatis延迟加载的具体机制及实现原理. 可以看出,如果查询结果对象中有一个属性是需要延迟加载的,那整 ...
- mybatis源代码分析:深入了解mybatis延迟加载机制
下文从mybatis(3.2.7)延迟加载样例讲起,逐步深入其实现机制. 下面的例子是Student类关联一个Teacher对象,在访问Student对象时,不立即加载其关联的Teacher对象,而是 ...
- Java基础-SSM之mybatis的统计函数和分页查询
Java基础-SSM之mybatis的统计函数和分页查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
随机推荐
- WPF InkCanvas 毛笔效果
原文:WPF InkCanvas 毛笔效果 1.先来看看InkCanvas的一般用法: <InkCanvas> <InkCanvas.DefaultDrawingAttrib ...
- echarts学习(上)
echarts 学习之路 学习思路 初识echarts 编写自己的echarts图表 根据需求编写工作中的echarts图表[进阶篇] github地址:https://github.com/liso ...
- 关闭Mac OS 的Rootless
今天在使用mac的时候,需要删除 /usr/bin/下的 自带的php文件.然后提示Operation not permitted 使用sudo 依然不可以,通过google 得到解决方案. 需要关闭 ...
- Qt SQLite 批量插入优化(SQLite默认将每条语句看成单独的事务)good
使用SQLite存储数据时发现插入速度太慢,程序跑了将近五分钟才插入了不到三千条.上网查资料才发现,SQLite这种文件数据库与MySql机制不一样,每条事务都有打开和关闭文件的步骤,SQLite默认 ...
- XF相对布局
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; [assembly: XamlCompilation (XamlCompila ...
- 基于IOCP的高速文件传输代码
//服务端: const //transmit用的参数 TF_USE_KERNEL_APC = $20; //命令类型 CMD_CapScreen = ...
- C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形
原文:C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形 在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形 最近在写WPF界面的时候遇到一个情 ...
- ArcGIS中Python逆地理编码,根据坐标获取实际的地址
import json import urllib import arcpy def getAddress(lng,lat): url= 'http://restapi.amap.com/v3/geo ...
- wpf事件绑定,比如一个控件的左键按下事件
<i:Interaction.Triggers> <i:EventTrigger EventName="MouseLeftButtonDown"> < ...
- C# 屏蔽Ctrl Alt Del 快捷键方法+屏蔽所有输入
原文:C# 屏蔽Ctrl Alt Del 快捷键方法+屏蔽所有输入 Win32.cs /* * * FileCreate By Bluefire * Used To Import WindowsApi ...