虚位以待(AD)
虚位以待(AD)
首页 > 数据库 > DB2数据库 > Mybatis延迟加载

Mybatis延迟加载
类别:DB2数据库   作者:码皇   来源:夕下奕林的专栏     点击:

现在有这么一个需求,要查询所有的订单,并且获得该订单的详细信息。如果一次性把所有需要的数据都请求到,那么对服务器和数据库的开销会很大,所以可以先加载订单信息,需要用到订单详情的时候再请求详情数据

现在有这么一个需求,要查询所有的订单,并且获得该订单的详细信息。

如果一次性把所有需要的数据都请求到,那么对服务器和数据库的开销会很大,所以可以先加载订单信息,需要用到订单详情的时候再请求详情数据。

那么就要用到mybatis的延迟加载

开启延迟加载
在mybaits配置文件中添加设置
    <!--延迟加载--><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
配置resultMap
原本的方式是在sql中连接两张表,然后在resultMap中用collection标签添加级联属性。现在可以把sql分成两部分,第一部分只查询订单表,第二部分通过订单id查询订单详情。
    <select id="findOrderUser" resultMap="orderUserResultMap"> SELECT * FROM orders</select>
    <select id="findDetailByOrdreId" resultType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom"> SELECT * FROM orderdetail WHERE orders_id = #{
    _parameter}
    </select>

然后配置orderUserResultMap,传统的方式在orderUserResultMap的collection配置级联属性,例如

    <!--订单详情list--><collection property="orderDetails" ofType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom"> <id column="orderdetail_id" property="id"/> <result column="orderdetail_orders_id" property="orders_id"/> <result column="orderdetail_items_id" property="items_id"/> <result column="orderdetail_items_num" property="items_num"/></collection>

如果这样的所有的数据将一次性查询,所以这里可以通过调用之前定义过的findDetailByOrdreId并通过延迟加载订单详情数据。

把上述的collection代码改为

    <collection property="orderDetails" column="id" ofType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom" select="cn.elinzhou.mybatisTest.mapper.OrderDetailMapper.findDetailByOrdreId"></collection>

这样就实现了延迟加载,下面对代码进行测试。

    @Testpublic void testFindOrders() throws Exception {
    OrdersMapper orderMapper = sqlSession.getMapper(OrdersMapper.class);
    List<OrdersCustrom> list = orderMapper.findOrderUser();
    /************观察代码执行到此处时控制台日志输出******************/ System.out.println(list);
    /************观察代码执行到此处时控制台日志输出******************/}

在上述代码的第一个注释前打一个断点,然后逐行运行代码观察日志

debug运行,在第一个断点停下,然后单步运行过List list = orderMapper.findOrderUser();这一句,可以看到控制台输出类似截图内容
这里写图片描述
说明此时只是查了Z喎"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcmRlcnOx7aOssqLDu9PQuPm+3WlksulvcmRlcmRldGFpbDxiciAvPg0KyLu687zM0PjWtNDQz8LSu77ko6y/ydLUv7S1vb/Y1sbMqMrks/bA4MvGyOfNvDxiciAvPg0KPGltZyBhbHQ9"这里写图片描述" src="http://www.ailab.com.cn/uploadfile/2016/0507/20160507101410452.png" title="" />

刚刚执行的代码只是为了打印出list中的内容,就对数据库进行检索,说明这是通过延迟加载实现。在真正需要用到orderdetail时才会去查orderdetail表,实现了按需分配。直到需要的时候才执行必要的代码,提高了服务器和数据库的效率。

相关热词搜索: Mybatis延迟加载