前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis 延迟加载(懒加载)

mybatis 延迟加载(懒加载)

作者头像
多凡
发布2019-11-01 09:19:31
2K0
发布2019-11-01 09:19:31
举报
文章被收录于专栏:sringbootsringboot

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44580977/article/details/96484510

1.为什么要延迟加载?

因为只有在用户需要的时候再去查询数据库,可以大大提高数据库性能

2.什么是延迟加载?

就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。

3.延迟加载实现思路?

立即加载方式:查询账户(Account)信息并且关联查询用户(User)信息。 SQL语句: select * from account a left outer join user u on u.id = a.uid

延迟加载方式:如果先查询账户(Account)信息即可满足要 求,当我们需要查询用户(User)信息时再查询用户(User)信息。把对用户(User)信息的按需去查询就是延迟加 载。 SQL语句: select * from account 封装到Account类里, 当使用到 Account类 的成员变量 User类时,执行 SQL语句: select * from account where uid = #{uid}

4.实现延迟加载配置(一对一,一对多)

数据库关系,一个账户对应一个用户,一个用户对应多个账户,如下

在这里插入图片描述
在这里插入图片描述
  • Mapper文件配置
代码语言:javascript
复制
	IAccountDao.xml mapper配置文件
<mapper namespace="com.itheima.dao.IAccountDao">

    <!-- 定义封装account和user的resultMap -->
    <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.itheima.dao.IUserDao.findById"></association>
    </resultMap>

    <!-- 查询所有 一对一用到的 -->
    <select id="findAll" resultMap="accountUserMap">
        select * from account
    </select>

    <!-- 根据用户id查询账户列表 一对多用到的 -->
    <select id="findAccountByUid" resultType="account">
        select * from account where uid = #{uid}
    </select>
</mapper>
代码语言:javascript
复制
	IUserDao.xml mapper配置
<mapper namespace="com.itheima.dao.IUserDao">

    <!-- 定义User的resultMap-->
    <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.itheima.dao.IAccountDao.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>
</mapper>
  • sqlMapConfig.xml配置
代码语言:javascript
复制
<!--配置参数-->
    <settings>
        <!--开启Mybatis支持延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"></setting>
    </settings>
代码语言:javascript
复制
官网文档解释
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
现在已经学会配置延迟加载了,明白什么是延迟加载了嘛?不不明白,再看看下面的测试你可能就知道了,
什么是用到的时候去查数据库了,懒加载(延迟加载)的精髓
  • 延迟加载效果

测试1

代码语言:javascript
复制
public class Account implements Serializable {

    private Integer id;
    private Integer uid;
    private Double money;

    //一个账户对应一个用户,一对一
    // 从表实体应该包含一个主表实体的对象引用
    private User user;
}
代码语言:javascript
复制
	测试类
    /**
     * 测试查询所有
     */
    @Test
    public void testFindAll(){
    //注意看,这里我们查询了,account 单没有 用他的user变量 
        List<Account> accounts = accountDao.findAll();
//        for(Account account : accounts){
//            System.out.println("--------每个account的信息------------");
//            System.out.println(account);
//            System.out.println(account.getUser());
//        }
    }

控制台输出

在这里插入图片描述
在这里插入图片描述

测试二

代码语言:javascript
复制
	和测试1相比只是释放了遍历
    /**
     * 测试查询所有
     */
    @Test
    public void testFindAll(){
        List<Account> accounts = accountDao.findAll();
        for(Account account : accounts){
            System.out.println("--------每个account的信息------------");
            System.out.println(account);
            System.out.println(account.getUser());
        }
    }

控制台输出

在这里插入图片描述
在这里插入图片描述

当遍历到user的时候,框架会通过account类的id开始去查询user,并完成封装 ,这就是懒加载

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.为什么要延迟加载?
  • 2.什么是延迟加载?
  • 3.延迟加载实现思路?
  • 4.实现延迟加载配置(一对一,一对多)
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档