Mybatis 延迟加载 菜鸟日记-day06

Mybatis 延迟加载

一、什么是延迟加载

 以订单表和用户表的关联查询来说:
 需求:查询订单信息,同时关联查询到订单的所属用户信息。
 需求变化:查询订单信息,但是进行关联查询到的所属用户信息可能用,也可能不用
 存在问题:sql 简单查询的速度较快,而复杂一些的关联查询比较慢且耗费资源更大。如果需求中用不到用户信息那么关联查询结果费力又多余
那么怎么才能实现,对关联查询按需进行,而不是每次查询都获取关联查询得到的用户信息?
Mybatis延迟加载技术闪亮登场

二、延迟加载的好处

主要就是上面提到的,查询单表(简单表)的信息,其他关联信息用到的时候再去调用,提高查询效率,节省数据库资源。

三、Mybatis使用延迟加载

1.打开开关(设置settings)

  settings属性中关于延迟加载的有

<settings>
     <!--开启延迟加载,默认为false-->
     <setting name="lazyLoadingEnabled" value="true"/>
     <!--关闭积极加载,默认为true-->
     <setting name="aggressiveLazyLoading" value="false"/>
 </settings>

延迟加载开关:开启的话,关联的对象可以延迟加载
积极加载开关:true 情况,你可以懒,但是你非要勤快,遇到可以延迟加载的都非要去直接加载。false情况,能偷懒就偷懒,你不是非要用到的话 我才不会去给你拿 --这是比较官方的解释:当设置为true时,懒加载的对象可能被任何懒属性全部加载;否则,每个属性按需加载

2.Mapper文件配置

1)原来的关联查询语句写成单表查询

  select 标签中的sql 进行单表查询 select * from 订单表。

2)ResultMap定义
 首先返回值是没有疑意的也就是

<resultMap type="订单类全限定名 " id="" >
    <id coloum="列名" property="对应类中属性名">
    ...
    <!--这些是没有任何变化的-->

 出现变化的位置,在association中实现对用户信息的延迟加载

<association 
propertype="订单信息中user属性" 
javaType="用户类--到这里都是没有任何变化的"  
select="statementid--这里指定了通过id查询用户的statement方法名" 
column="这里指定用作关联查询的条件字段 也就是user_id" >
<!--通过select column 这两行指定方法+传入参数 实现对User的 延迟加载 的关联查询-->
</association>

<!--collection 也是一样的-->

3.测试使用

//sqlSessionFactory 创建sqlSession
// 获得Mapper 代理
// 查询所有订单信息
for(订单类 order:订单查询结果)
{
    //其他省略
    //下面调用getUser方法
    order.getUser();
    //当循环到 order的user_id 和上一个order user_id 不同时才会向数据库发出请求,查询得到User对象
}

猜你喜欢

转载自blog.csdn.net/qq_38325853/article/details/85168022