首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mybatis的延迟加载

Mybatis的延迟加载

作者头像
暴躁的程序猿
发布2022-03-23 16:52:05
发布2022-03-23 16:52:05
87600
代码可运行
举报
运行总次数:0
代码可运行

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

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

二、Mybatis中的延迟加载

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

代码语言:javascript
代码运行次数:0
运行
复制
public interface IAccountDao {

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

2.映射文件:

代码语言:javascript
代码运行次数:0
运行
复制
<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主配置文件配置开启懒加载

代码语言:javascript
代码运行次数:0
运行
复制
<!--加入settings-->
   <settings>
        <!--开启Mybatis支持延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"></setting>
    </settings>

4.测试

代码语言:javascript
代码运行次数:0
运行
复制
@Test
 public void testFindAll(){
        List<Account> accounts = accountDao.findAll();
    }

效果图 没开启延迟加载之前执行了三条

开启了延迟加载后 执行了一条语句

一对多实现延迟加载: 1. dao层接口 List findAll(); 2.映射文件

代码语言:javascript
代码运行次数:0
运行
复制
//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>
代码语言:javascript
代码运行次数:0
运行
复制
<!-- 根据用户id查询账户列表 account -->
    <select id="findAccountByUid" resultType="account">
        select * from account where uid=#{uid}
    </select>

3.测试类:

代码语言:javascript
代码运行次数:0
运行
复制
  @Test
    public void testFindAll(){
        List<User> users = userDao.findAll();
    }

只查询了用户并没有查用户下账户的信息

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么叫延迟加载、立即加载
  • 二、Mybatis中的延迟加载
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档