Mybatis的延迟加载

一、什么叫延迟加载、立即加载

1.什么是延迟加载
在真正需要使用数据时才发起查询,不用的时候不进行查询。按需加载(懒加载)
2. 什么是立即加载
不管用不用,只要一调用方法,马上发起查询。

二、Mybatis中的延迟加载

需求:
在一对多中,当我们有一个用户,它有10个角色。
在查询用户时,用户下的角色信息应该是,什么时候使用,什么时候查询的。
在查询角色时,账户的所属用户信息应该是随着账户查询时一起查询出来。
在对应的四种表关系中:
一对多,多对一,一对一,多对多
一 对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
一对一延迟加载:
例:以用户和账户关系为例,查询一个账户时显示当前账户的所属用户
查询方法
1.dao层接口

public interface IAccountDao {

    /**
     * 查询所有账户,同时还要获取到当前账户的所属用户信息
     * @return
     */
    List<Account> findAll();
    }

2.映射文件:

<resultMap id="accountUserMap" type="account">
        <id property="id" column="id"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!-- 一对一的关系映射:配置封装user的内容
        select属性制定的内容:查询用户的唯一标识
         column属性指定的内容:用户根据id时,所需要的参数值的值-->
        <association property="user" column="uid" javaType="user" select="com.rpf.dao.IUserDao.findById"></association>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="accountUserMap">
        select * from account
    </select>

   

3.Mybatis主配置文件配置开启懒加载

<!--加入settings-->
   <settings>
        <!--开启Mybatis支持延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"></setting>
    </settings>

4.测试

@Test
 public void testFindAll(){
        List<Account> accounts = accountDao.findAll();
    }

效果图
没开启延迟加载之前执行了三条
在这里插入图片描述

开启了延迟加载后 执行了一条语句
在这里插入图片描述
一对多实现延迟加载:
1. dao层接口
List findAll();
2.映射文件

//user
  <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 配置user对象中accounts集合的映射 -->
        <collection property="accounts" ofType="account" select="com.rpf.dao.AccountDao.findAccountByUid" column="id"></collection>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="userAccountMap">
        select * from user
    </select>

    <!-- 根据id查询用户 -->
    <select id="findById" parameterType="INT" resultType="user">
        select * from user where id = #{uid}
    </select>
<!-- 根据用户id查询账户列表 account -->
    <select id="findAccountByUid" resultType="account">
        select * from account where uid=#{uid}
    </select>

3.测试类:

  @Test
    public void testFindAll(){
        List<User> users = userDao.findAll();
    }

只查询了用户并没有查用户下账户的信息
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值