如今有这么一个需求,要查询全部的订单,而且得到该订单的详细信息。java
若是一次性把全部须要的数据都请求到,那么对服务器和数据库的开销会很大,因此能够先加载订单信息,须要用到订单详情的时候再请求详情数据。sql
那么就要用到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代码改成markdown
<collection property="orderDetails" column="id" ofType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom" select="cn.elinzhou.mybatisTest.mapper.OrderDetailMapper.findDetailByOrdreId"> </collection>
这样就实现了延迟加载,下面对代码进行测试。mybatis
@Test public void testFindOrders() throws Exception { OrdersMapper orderMapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersCustrom> list = orderMapper.findOrderUser(); /************观察代码执行到此处时控制台日志输出******************/ System.out.println(list); /************观察代码执行到此处时控制台日志输出******************/ }
在上述代码的第一个注释前打一个断点,而后逐行运行代码观察日志app
debug运行,在第一个断点停下,而后单步运行过List list = orderMapper.findOrderUser();这一句,能够看到控制台输出相似截图内容
说明此时只是查了orders表,并无根据id查orderdetail
而后继续执行下一句,能够看到控制台输出相似如图
测试
刚刚执行的代码只是为了打印出list中的内容,就对数据库进行检索,说明这是经过延迟加载实现。在真正须要用到orderdetail时才会去查orderdetail表,实现了按需分配。直到须要的时候才执行必要的代码,提升了服务器和数据库的效率。spa