延迟加载
一、什么是延迟加载
延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。
在mybatis中,resultMap标签的association标签和collection标签具有延迟加载的功能。
二、案例
1、需求
查询订单信息,关联查询用户信息
1、 创建一个statement来查询订单信息
2、 创建一个statement来查询用户信息
2、映射文件
(1)创建查询订单信息的映射文件
<!-- lazyLoadingRstMap -->
<resultMap type="ordersExt" id="lazyLoadingRstMap">
<!-- 订单信息 -->
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<!-- 用户信息(一对一) -->
<!-- select:指定关联查询的查询statement(即查询用户的statement的id),然后将查询结果,封装到property属性指定的变量中 -->
<!-- column:通过column指定的列所查询出的结果,作为select指的statement的入参 -->
<!-- 注意:如果select指定的statement,入参需要多个值,需要在column中{col1=prop1,col2=prop2} -->
<association property="user"
select="com.hcx.mybatis.mapper.UserMapper.findUserById" column="user_id"></association>
</resultMap>
<!-- 延迟加载 -->
<select id="findOrderAndUserLazyLoading" resultMap="lazyLoadingRstMap">
SELECT * FROM orders
</select>
(2)创建查询用户信息的映射文件
<mapper namespace="mapper.UserMapper">
<!-- 根据用户ID查询用户信息 -->
<select id="findUserById" parameterType="int">
SELECT * FROM USER WHERE id = #{id}
</select>
3、Mapper接口
//延迟加载
public List<OrdersExt> findOrderAndUserLazyLoading();
4、测试代码
@Test
public void testLazyLoading() {
// 创建OrdersMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
List<OrdersExt> list = mapper.findOrderAndUserLazyLoading();
//按需加载时,是需要的时候再去数据库中查找
for (OrdersExt order : list) {
System.out.println(order.getUser());
}
sqlSession.close();
}
5、设置延迟加载
在SqlMapConfig.xml中,配置settings标签
<settings>
<!-- 开启延迟加载 ,默认值为true-->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置积极的懒加载,默认是true -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>