文章目录
延迟加载
概述
延迟加载本身是依赖于多表查询的
- 延迟加载中返回值要选择resultMap
- 返回的结果一定是Dto
延迟加载也可以成为按需加载;默认是没有开启的
步骤
- 在config.xml中配置下面代码
<!-- lazyLoadingEnabled:延迟加载全局开关,开启后所有关联对象
都会延迟加载;默认是false
aggressiveLazyLoading:按需加载;
开启时,任一方法的调用都会加载该对象的所有延迟加载属性,因此设置为false;
设置为false表示的意思就是按需加载;mybatis版本3.4以上默认是false
-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
使用的时候需要将lazyLoadingEnabled设置为true,将aggressiveLazyLoading设置为false
- 在mapper.xml中书写下面代码
<!-- 一对多 -->
<select id="selectOrderAndDetails" resultMap="map1" >
select * from b_order
</select>
<resultMap type="BOrderDto" id="map1" extends="BaseMap">
<!-- 延迟加载和多表查询(高级映射)的区别:
在标签(collection或者association)中,添加column属性和select属性;
select属性中:里面的内容写的是:namespace.sqlID;
表示的是:用来封装当前collection或者association的返回结果
也就是select属性值中的sqlid查询出来的应该是和ofType同等类型;
column属性指的是:第一步查询结果中的列名——》用作参数传入到select调用的sqlId中;
-->
<collection property="details" ofType="BOrderDetailDto" column="id" select="selectDetails">
</collection>
</resultMap>
<!-- 按需加载,如果还需要查看订单详情信息,则调用该方法: -->
<select id="selectDetails" resultMap="map2">
select id detail_id, goods_id, main_id, price, num
from b_order_detail where main_id = #{id}
</select>
<resultMap type="BOrderDetailDto" id="map2">
<id column="detail_id" property="id"></id>
<result column="goods_id" property="goodsId"/>
<result column="main_id" property="mainId"/>
<result column="price" property="price"/>
<result column="num" property="num"/>
</resultMap>
缓存
mybatis为减轻数据库压力,提高数据库性能。提供了两级缓存机制:
mybatis框架中包含了一级缓存和二级缓存