Mybatis延迟加载

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

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

那么就要用到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>

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

@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表,实现了按需分配。直到需要的时候才执行必要的代码,提高了服务器和数据库的效率。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 00:10:16

Mybatis延迟加载的相关文章

测试mybatis延迟加载错误与解决方法

什么是延迟加载? 延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去加载从信息. 需求: 查询订单信息,需要时再去查询用户信息 实现方式: 编写两个statement,其中一个statement是查询订单信息,一个是查询用户信息,但是查询订单信息的statement要使用resultMap标签进行结果映射. Mapper接口: /**  * 延迟加载  查询订单 需要时在查询用户信息  * */  public List<OrderExt> lazyLoading();

mybatis 延迟加载学习

一.什么是延迟加载 resultMap可实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 二.使用association实现延迟加

mybatis延迟加载——(十二)

1.     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 延迟加载:先从单表查询.需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快. 2.    打开延迟加载开

10.MyBatis 延迟加载,一级缓存,二级缓存 设置

什么是延迟加载  resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息. 设置延迟加载 需要在SqlMapConfig.xml文件中,在<settings>标签中设置下延迟加载. lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置懒加载.如果设为'fals

MyBatis延迟加载和缓存

一.延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载. 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主对象属性的属性的时候,关联对象会被加载 03.深度延迟 访问主对象,并不加载关联对象 访问主对象的属性的时候,关联对象也不会被加载 访问关联对象或关联对象的属性的时候,才会加载关联对象. 3.一对多延迟加载代码: 01.实体类代码: package cn.pb.bean; import java.u

mybatis延迟加载一对多

1.实体类 package cn.bdqn.bean; import java.util.Set; /** *国家的实体类 */ public class Country { private Integer cId; // 国家的编号 private String cName; // 国家的名称 private Set<Provincial> provincials; public Integer getcId() { return cId; } public void setcId(Inte

Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载(转发同上)

原地址:http://www.cnblogs.com/shanheyongmu/p/7124608.html 1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查下用户信息.把对用户信息的按需去查询就是延迟加载. 延迟加载:先从单表查询.需要时再从关联表去

Mybatis延迟加载和查询缓存

一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置

mybatis 延迟加载 ,查询缓存

阅读目录 一.延迟加载 二.查询缓存 回到顶部 一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值