Mybatis之延迟加载

匿名 (未验证) 提交于 2019-12-03 00:22:01

延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。
.
在mybatis中,resultMap标签的association标签和collection标签具有延迟加载的功能。

查询订单信息,再按需查找关联的用户信息,即延迟查找关联的信息 1、  创建一个statement来查询订单信息 2、  创建一个statement来查询用户信息

订单映射文件

<resultMap type="com.zyj.mybatis.dto.OrdersExt" id="OrderRstMap">     <!-- 订单信息 -->     <id column="id" property="id"/>     <result column="createtime" property="createtime"/>     <!-- 用户信息(一对一) -->     <!-- select:指定关联查询的查询statement(即查询用户的statement的id),然后将查询结果,封装到property属性指定的变量中 -->     <!-- column:通过column指定的列所查询出的结果,作为select指的statement的入参 -->     <!-- 注意:如果select指定的statement,入参需要多个值,需要在column中{col1=prop1,col2=prop2} -->     <association property="user" select="com.zyj.mybatis.mapper.UserMapper.findUserById" column="user_id"></association> </resultMap> <!-- 延迟加载 --> <select id="findOrderByLazyLoding" resultMap="OrderRstMap">     select * from orders </select>

用户映射文件

<select id="findUserById" parameterType="int" resultType="com.zyj.mybatis.po.User">     select * from user where id = #{id} </select>

测试代码

@Test public void testFindOrderByLazyLoding() {     //......     List<OrdersExt> list = mapper.findOrderByLazyLoding();     //...... }

结果

问题:我们会发现在测试代码中并没有使用订单中的user,但mybatis还是直接查询了user  解决办法:在mybatis的全局配置文件中开启延迟加载 
<settings>     <!-- 开启延迟加载,默认值为false-->     <setting name="lazyLoadingEnabled" value="true"/>      <!-- 设置积极的懒加载,默认是false-->     <setting name="aggressiveLazyLoading" value="true"/> </settings>

配置完成后,再执行测试代码,结果只查询了orders

修改测试代码

@Test public void testFindOrderByLazyLoding() {     //......     List<OrdersExt> list = mapper.findOrderByLazyLoding();     for (OrdersExt ordersExt : list) {         System.out.println(ordersExt.getUser().getId());     }     //...... }

运行结果

结论:这说明延迟加载起作用,而且是按需加载

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!