Mybatis-HM(7)-延迟加载-缓存

本文详细介绍了MyBatis的延迟加载和缓存机制。延迟加载用于优化一对多、多对一的关系加载,只在实际需要时查询数据。一级缓存是SQLSession级别的,二级缓存则在SQLSessionFactory级别,可以跨session共享数据,减少数据库交互,提高性能。配置和使用二级缓存的步骤也进行了说明。
摘要由CSDN通过智能技术生成

延迟加载简介

在一对多中,我们有一个用户,它有100个账户
在查询用户的时候,要不要把关联的账户查出来?
在查询账户的时候,要不要把关联的用户查处理来?

在查询用户时,用户下的账户信息应该是什么时候使用,什么时候查处理来!
在查询账户时,账户所属的用户信息,应该一起查询出来。

什么是延迟加载?
在真正使用数据时才发起查询,不用的时候不查询,按需加载(懒加载)
什么是立即加载
不管用不用,只要一调用方法,就查询处理啊

在对应的四种表关系中: 一对多、多对一、一对一、多对多
延迟加载:一对多,多对多
立即加载:多对一,一对一

一对一实现延迟加载

先定义根据ID查询用户

User findById(Integer id);
    <select id="findById" resultType="com.kcl.pojo.User" parameterType="int">
        select * from user where id = #{id}
    </select>

定义查询账户,同时关联用户

    List<Account> findAll();

    <resultMap id="accountUserMap" type="com.kcl.pojo.Account">
        <id property="id" column="id"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--
            select:查询用户的唯一标志
            column: 懒加载必须写,表示用户根据id查询时,所需要的参数值
        -->
        <association property="user" column="uid" javaType="com.kcl.pojo.User" select="com.kcl.dao.UserDao.findById"></association>
    </resultMap>


    <select id="findAll" resultMap="accountUserMap">
        select * from account
    </select>

在这里插入图片描述
在mybatisConfig.xml进行配置

    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--开启时,任何加载的调用都会加载该对象的所有属性,否则,每个属性都会按需加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

一对多

类似于一对一的方法

缓存介绍

  • 什么是缓存?
  • 存在内存中的数据
  • 为什么使用缓存?
  • 减少和数据库的交互次数,提高执行效率
  • 什么样的数据使用缓存,什么数据不能使用?
  • 经常查询且不经常改变的,数据的正确与否对结果不大的,适用于缓存
  • 经常改变的数据,数据的正确性对结果影响很大不使用缓存,比如商品的库存,银行的汇率等

一级缓存

  • 它指的是mybatis中SQLSession对象的缓存
  • 当我们执行查询之后,查询的结果会同时存储SQLSession为我们提供的一块区域中
  • 该区域的结构是一个Map
  • 当我们再次查询同样的数据,mybatis会先去SQLSession中查询是否存在,如果有就拿出来
  • 当SQLSession对象消失时,mybatis的一级缓存就消失了
  • 当调用SQLSession的update、add、delete、commit(),cloes()等方法时,就会清空一级缓存!!!!!

二级缓存

  • 它指的是mybatis中SQLSessionFactory对象的缓存。
  • 由同一个SQLSessionFactory创建的SQLSession共享其缓存
    在这里插入图片描述
    使用步骤:
  1. 让mybatis框架支持二级缓存,在mybatisConfig.xml配置
  2. 让当前的映射文件中支持二级缓存, 在UesrDao.xml配置
  3. 让当前操作支持二级缓存,在select标签中配置
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--开启时,任何加载的调用都会加载该对象的所有属性,否则,每个属性都会按需加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    <!--开启user支持二级缓存-->
    <cache/>
    <select id="findById" useCache="true" resultType="com.kcl.pojo.User" parameterType="int" >
        select * from user where id = #{id}
    </select>

二级缓存中存放的是数据,而不是对象!
不同的SQLSession查询时,查询出来的对象不是同一个,但是从二级缓存中拿出来的,让一个SQLSession.close,然后查询第二个SQLSession

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值