MyBatis 延迟加载 (懒加载)

下面我们讲延迟加载 也叫 懒加载。 
延迟加载:resultMap 的数据以 树状结构 为主,当我们用到分支数据的时候再查下,反之则,不查询,这样可以节省数据库资源。

那么我在上一个demo的基础做一点小改进:

1、首先在 mybatis-config.xml 中添加设置:

<configuration>
    <settings><!--  -->
        <!-- 懒加载设置为 true -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 积极加载设置为false -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

2、修改 Mapper 映射文件 OrderDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<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 映射的 参数。

测试代码:

/**
 * Unit test for simple App.
 */
public class AppTest extends TestCase {
    public void selectOrder() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        OrderDaoLazy mapper = session.getMapper(OrderDaoLazy.class);

        List<Orders> orders = mapper.findOrderDetailLazy();

        for(int i=0; i<orders.size(); i++){
            System.out.println(orders.get(i).toString());
        }
        session.close();
    }
}
  •  

注意:由于我们的Order类中的 toString方法 读取了User 和 OrderItem对象,出发了懒加载,所以你会看到控制台打印了3次 select 语句,当我们调用数据时才会查询数据库。(如果想进步测试,可以将 Order 类中的toString,方法去掉,然后分别调用getUser 和 getOrderItems 方法,通过断点方式去查看)

猜你喜欢

转载自blog.csdn.net/jiaowo_ccc/article/details/81204943
今日推荐