延迟加载:
resultMap 的数据以 树状结构 为主,当我们用到分支数据的时候再查下,反之则,不查询,这样可以节省数据库资源。
在代码中可以更详细一些。
<settings><!-- -->
<!-- 懒加载设置为 true -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 积极加载设置为false -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
Mybatis的配置文件规定setting配置顺序得在properties节点下。
association 和collection 就具有懒加载特性
在Mapper配置文件中配置如下:
<mapper namespace="com.zll.mybatis.dao.OrderDaoLazy">
<resultMap type="com.zll.mybatis.bean.Orders" id="findOrderDetailMap">
<id column="id" property="id" />
<result column="createTime" property="createTime" />
<result column="userId" property="userId" />
<association property="user" javaType="com.zll.mybatis.bean.User"
column="id" select="findUser" />
<collection property="orderItems" ofType="com.zll.mybatis.bean.OrderItem"
column="id" select="findOrdersItem" />
</resultMap>
<select id="findOrderDetailLazy" resultMap="findOrderDetailMap">
select * from orders
</select>
<select id="findUser" parameterType="int" resultType="com.zll.mybatis.bean.User">
select *
from user where id = #{id}
</select>
<select id="findOrdersItem" parameterType="int" resultType="com.zll.mybatis.bean.OrderItem">
select * from orderItem where orderId = #{id}
</select>
</mapper>
注意:由于是懒加载是分开查询,所以我们的每个select 映射也需要分开写。
这里需要注意的就是 association 和 collection 标签中的 column 和select属性
select: 填写 我们要调用的 select 映射的 id
column : 填写 我们要传递给 select 映射的 参数。
测试时只要输出list对象中的order的id。读取了User 和 OrderItem对象,出发了懒加载,所以你会看到控制台打印了3次 select 语句,当我们调用数据时才会查询数据库。