延迟加载:
延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。需要关联信息时再去按需加载关联信息。这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
resultMap中的association和collection标签具有延迟加载的功能。
需求:查询订单信息,关联查询用户信息
订单信息为主信息,用户信息为从信息
1设置延迟加载
在全局配置文件sqlMapConfig中,配置settings标签
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2映射文件(两个)
创建查询订单信息的映射文件 OrdersMapper.xml
只查询订单信息
SELECT * FROM orders
在查询订单的statement中使用association去延迟加载(执行)下边的satatement(关联查询用户信息)
<!-- 延迟加载 -->
<resultMap type="cn.itcast.po.OrderExt" id="lazyLoadingRstMap">
<!-- 订单信息 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<!-- 用户信息 一对一 property:结果封装到property指定的变量中 , select:statement的id column:指定列查询结果,作为select的入参 -->
<association property="user" select="cn.itcast.mapper.UserMapper.findUserById" column="user_id">
</association>
</resultMap>
<select id="findOrderAndUserLazyLoading" resultMap="lazyLoadingRstMap">
select * from orders
</select>
创建查询用户信息的映射文件 UserMapper.xml
通过上边查询到的订单信息中user_id去关联查询用户信息
<!-- 根据用户ID查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="cn.itcast.po.User">
select * from user where id = #{id}
</select>
3Mapper接口
public List<OrderExt> findOrderAndUserLazyLoading();
4测试
@Test
public void testFindOrderAndUserLazyLoading() {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
List<OrderExt> list = ordersMapper.findOrderAndUserLazyLoading();
for (OrderExt orderExt : list) {
System.out.println(orderExt.getUser());
}
sqlSession.close();
}