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对象
}