MyBatis 之 使用五 延迟加载(Lazy Load)

1. LazyLoad 的作用:

在数据与对象进行 mapping 操作时,只有在真正使用到 该对象时,才进行 mapping 操作,以减少数据库查询开销,从而提升系统性能。

但是Lazy Load也有缺点,在 按需加载时会多次连接数据库,同时会增加数据库的压力。所以在实际使用时,会衡量是否使用 延迟加载。

2. 实现:

1)在 sqlMapConfig.xml 文件中配置 Lazy Load 的开关。

<settings>
	<!-- 开启全局性设置懒加载 -->
	<setting name="lazyLoadingEnabled" value="true"/>
	<!-- 开启按需加载 -->
	<setting name="aggressiveLazyLoading" value="false"/>
</settings>

2)在 sqlMapper.xml 映射文件中中配置sql映射,这里是一对一查询<association>,也可用在 <collection>中

<!-- 订单及用户信息, Lazy Load -->
<resultMap id="orderAndUser" type="mybatis_b.model.Order">
  <!-- id 这里表示结果集的唯一主键,虽然出现重复的orderDetail,但是属于同一个orderId -->
  <id property="orderId" column="orderId"/>
  <result property="user_id" column="user_id"/>
  <result property="orderNumber" column="orderNumber"/>
  <!-- 延迟加载,通过 findUserById 来查询User 信息, column="user_id" 是上面查询出来的userid,作为parameterType传入到 findUserById 方法 -->
  <association property="user" javaType="mybatis_b.model.User" select="findUserById" column="user_id">
  	<!-- 这里可以使用延迟加载来查询User信息,通过  findUserById 
  	<id property="userId" column="userId"/>
	<result property="username" column="username"/>
	<result property="sex" column="sex"/>
	<result property="birthday" column="birthday"/>
	<result property="address" column="address"/>
	<result property="detail" column="detail"/>
	<result property="score" column="score"/>
  	-->
  </association>
</resultMap>
  
<!-- user 查询 -->
<select id="findUserById" parameterType="int" resultType="user">
  select * from users where userId = #{user_id}
</select>
  
<select id="findOrderAndUser_lazyLoad" resultMap="orderAndUser">
  select * from orders
</select>

3)定义 mapper 接口,并调用接口方法

//延迟加载
	@Test
	public void testFindOrderAndUser_lazyLoad() throws Exception {
		//获取SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//指定 mapper 接口的类型,MyBatis通过动态代理的方式实现mapper接口
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

		List<Order> list = orderMapper.findOrderAndUser_lazyLoad();

		System.out.println(list.size());
		//Iterator<Order> iterator = list.iterator();
		//while (iterator.hasNext()) {
			//Order order = (Order) iterator.next();
			//System.out.println(order.getUser());
		//}
	}

执行结果:

如果去掉上面代码注释的部分,那么就调用了getUser()的方法,mybatis 会自动调用 findUserById() 去获取 User信息。结果如下:

如果关闭了 Lazy Load,那么结果是这样的:

时间: 2024-10-01 03:45:24

MyBatis 之 使用五 延迟加载(Lazy Load)的相关文章

Hibernate延迟加载Lazy

延迟加载(lazy load)又称为懒加载,延迟加载的机制是为了避免一些无谓性能的开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作 如何配置延时加载呢? 在Hibernate中通过对.hbm的lazy属性来赋值,不同位置出现lazy的作用和取值也是不同的,下面我们来分别介绍 一.Class标签中的lazy 我们可以看到class标签中的lazy有两个取值,分别为true和false,当lazy值为默认值true时,它是延迟加载的,当lazy值为false时,是立即加

Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

Lazy Load, 延迟加载图片的 jQuery 插件

本文翻译自 Lazy Load Plugin for jQuery, 介绍一个 jQuery 插件, 它提供懒汉式加载页面图片的功能. Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服

Lazy Load延迟加载图片效果

前些日子自己想搞个延时加载的玩玩,但js自己是不会写的,只有上网找插件了.在网上找了好多,都比较坑爹!为什么呢?大部分文章都是他妹的一篇不停的转载,这地方省一点那地方省一点.你说你转载就算了,保留原出处链接也行啊,这样也方便大家可以有更大的收获.但事实上是什么样子,我也就不多说了,我相信上网查过资料的亲都有过感受.在网上找了好久,最终还是有收获的.自己弄了几个小时后,终于折腾出来了.下面献上自己整理的源码,大神喷时还请手留情.先附一张效果图: css样式: .lazy{width:400px;h

jQuery Lazy Load 图片延迟加载

基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. 版本: jQuery v1.4.4+ jQuery Lazy Load v1.7.2 注意事项: 需要真正实现图片延迟加载,必须将真实图片地址写在 data-original 属性中.若 src 与 data-original 相同,则只是一个特效而已,并不达到延迟加载的功能. 载入 JavaScript 文件 <script src="jqu

Lazy Load, 延迟加载图片的 jQuery 插件(转)

Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担. Lazy Load 灵感来自 Matt Mlinac 制作的 YUI ImageLoader 工具箱. 这是演示页面. 这里

Entity中Lazy Load的属性序列化JSON时报错

The server encountered an internal error that prevented it from fulfilling this request.org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: com.party.dinner.entit

android lazy load image from the Internet

/* 延迟加载的特性 *Lazy load of images in ListView *I am using a ListView to display some images and captions associated with those images. *I am getting the images from the Internet. Is there a way to lazy load the images so while the text displays, *the U

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB