标签:
现在有这么一个需求,要查询所有的订单,并且获得该订单的详细信息。
如果一次性把所有需要的数据都请求到,那么对服务器和数据库的开销会很大,所以可以先加载订单信息,需要用到订单详情的时候再请求详情数据。
那么就要用到mybatis的延迟加载
<!--延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<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>
这样就实现了延迟加载,下面对代码进行测试。
@Test
public void testFindOrders() throws Exception {
OrdersMapper orderMapper = sqlSession.getMapper(OrdersMapper.class);
List<OrdersCustrom> list = orderMapper.findOrderUser();
/************观察代码执行到此处时控制台日志输出******************/
System.out.println(list);
/************观察代码执行到此处时控制台日志输出******************/
}
在上述代码的第一个注释前打一个断点,然后逐行运行代码观察日志
debug运行,在第一个断点停下,然后单步运行过List list = orderMapper.findOrderUser();这一句,可以看到控制台输出类似截图内容
说明此时只是查了orders表,并没有根据id查orderdetail
然后继续执行下一句,可以看到控制台输出类似如图
刚刚执行的代码只是为了打印出list中的内容,就对数据库进行检索,说明这是通过延迟加载实现。在真正需要用到orderdetail时才会去查orderdetail表,实现了按需分配。直到需要的时候才执行必要的代码,提高了服务器和数据库的效率。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u011403655/article/details/46699269