MyBatis_延迟加载

1 延迟加载

resultMap可以实现高级映射(使用association, collection实现一对一 和一对多映射) association, collection具备延迟加载功能

需求:
如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

  延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。

2 使用association实现延迟加载

需求:
查询订单并且关联用户信息

mapper.xml
需要定义两个mapper的方法对应的statement

a 只查询订单信息
SELECT * FROM orders
在查询订单的statement中使用association去延迟加载(执行)下边的statement(关联查询用户信息)
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
	    SELECT
	    	*
	    FROM
	    	orders
	</select>
b 关联查询用户信息
通过上边查询到的user_id去关联查询用户信息
<!-- 通过用户id查询用户信息 -->
	<select id="findUserById" parameterType="int" resultType="cn.minyan.mybatis.bean.User">
	    SELECT
	    	*
	    FROM
	    	user
	    WHERE
	    	id = #{id}
	</select>

上边先去执行findOrdersUserLazyLoading,当需要去查询用户的时候再去执行findUserById,通过resultMap的定义将延迟加载执行配置起来。

3 延迟加载resultMap

使用association中的select指定延迟加载去执行的statementid

<!-- 延迟加载的resultMap -->
	<resultMap type="cn.minyan.mybatis.bean.Orders" id="OrdersUserLazyLoadingResultMap">
	    <!-- 对订单信息进行映射设置 -->
	    <id column="id" property="id"/>
	    <result column="user_id" property="userId"/>
	    <result column="number" property="number"/>
	    <result column="createtime" property="createtime"/>
	    <result column="note" property="note"/>
	    <association property="user" javaType="cn.minyan.mybatis.bean.User"
	         select="cn.minyan.mybatis.dao.Mapper.findUserById" column="user_id">
	    </association>
	</resultMap>

4 mapper.java

public List<Orders> findOrdersUserLazyLoading() throws Exception;

5 测试

a 测试思路

1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用cn.minyan.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查询orders信息(单表)。

 2、在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始进行延迟加载。

 3、延迟加载,去调用UserMapper.xmlfindUserbyId这个方法获取用户信息。

b 延迟加载配置
mybatis
默认没有开启延迟加载,需要在SqlMapConfig.xml中settings设置

lazyLoadingEnabled、aggressiveLazyLoading

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true

<!-- 全局配置参数,需要时在配置 -->
	<settings>
	    <setting name="lazyLoadingEnabled" value="true"/>
	    <setting name="aggressiveLazyLoading" value="false"/>
	</settings>

注意:若SqlMapConfig.xml中还有其他配置,settings需要放在最上面

TestJava
/**
	 * 测试延迟加载
	 * @throws Exception
	 */
	@Test
	public void findOrdersUserLazyLoadingTest() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		Mapper mapper = sqlSession.getMapper(Mapper.class);
		System.out.println("===> " + mapper.getClass());
		
		List<Orders> orders = mapper.findOrdersUserLazyLoading();
		System.out.println("===> " + orders);
		
		for (Orders order : orders) {
			User user = order.getUser();
			System.out.println("===> " + user);
		}
		
		sqlSession.close();
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值