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

延迟加载简介

在一对多中,我们有一个用户,它有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>

Mybatis-HM(7)-延迟加载-缓存
在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共享其缓存
    Mybatis-HM(7)-延迟加载-缓存
    使用步骤:
  1. 让mybatis框架支持二级缓存,在mybatisConfig.xml配置
  2. 让当前的映射文件中支持二级缓存, 在UesrDao.xml配置
  3. 让当前操作支持二级缓存,在select标签中配置
    <settings>
        <setting name="chacheEnabled" 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

上一篇:ConfigFileUtil读写操作


下一篇:FIR特性及仿真实现_01