Mybatis07_延迟加载

1、延迟加载

  1)就是在需要数据的时候去加载,不需要数据的时候就不加载。也称为懒加载

  2)好处:先去单表查询,需要关联表的数据的时候再去关联表查询,大大的提高了数据库的性能,因为单表查询的速度比关联表查询更快

  3)弊端:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降。

2、示例

  分析:查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要求,

     当我们需要查询用户(User)信息时再查询用户(User)信息。把对用户(User)信息的按需去查询就是延迟加载。

  可以实现的条件:association、collection 具备延迟加载功能

  1)使用association实现延迟加载

    场景:查询账户信息,同时查询用户信息

    账户持久层DAO

public interface IAccountDao {
  /**
  * 查询所有账户,同时获取账户的所属用户名称以及它的地址信息
  * @return
  */
  List<Account> findAll();
}

    账户持久层映射文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="com.itheima.dao.IAccountDao">
    <!-- 建立对应关系 -->
    <resultMap type="account" id="accountMap">
      <id column="aid" property="id"/>
      <result column="uid" property="uid"/>
      <result column="money" property="money"/>
      <!-- 它是用于指定从表方的引用实体属性的 -->
      <association property="user" javaType="user"
        select="com.itheima.dao.IUserDao.findById"
        column="uid">
      </association>
    </resultMap>
    <select id="findAll" resultMap="accountMap">
      select * from account
    </select>
</mapper>
select: 填写我们要调用的 select 映射的 id 
column : 填写我们要传递给 select 映射的参数
复制代码

    用户持久层DAO

public interface IUserDao {
  /**
  * 根据 id 查询
  * @param userId
  * @return
  */
  User findById(Integer userId);
}

    用户映射文件配置

<mapper namespace="com.itheima.dao.IUserDao">
  <!-- 根据 id 查询 -->
  <select id="findById" resultType="user" parameterType="int" >
    select * from user where id = #{uid}
  </select>
</mapper>

  注意:配置完成后,如果想要使用Mybatis的延迟加载策略,需要在主配置文件中告诉Mybatis开启

 

 

   在Mybatis中开启延迟加载

<settings>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" value="false"/>//因为这里默认便是false,所以不写也可以
</settings>

  测试

List<Account> accounts = accountDao.findAll();

  控制台的输出

 

 

   2)Collection实现延迟加载

    用户持久层配置

复制代码
<resultMap type="user" id="userMap">
  <id column="id" property="id"></id>
  <result column="username" property="username"/>
  <result column="address" property="address"/>
  <result column="sex" property="sex"/>
  <result column="birthday" property="birthday"/>
  <!-- collection 是用于建立一对多中集合属性的对应关系
    ofType 用于指定集合元素的数据类型
    select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
    column 是用于指定使用哪个字段的值作为条件查询
  -->
  <collection property="accounts" ofType="account"
    select="com.itheima.dao.IAccountDao.findByUid"
    column="id">
  </collection>
</resultMap>
<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
  select * from user
</select>
<collection>标签:
主要用于加载关联的集合对象
select 属性:
用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 id
column 属性:
用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,所以就写成 id 这一
个字段名了
复制代码

 

posted @   CGGirl  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示