07 MyBatis的懒加载和缓存机制

一、先说说懒加载吧

为什么要用它?当嵌套查询多层的时候,数据量非常大,
而内存有限的情况下,使用它久能够节省内存.
怎么用?
设置在全局配置文件(mybatis-config.xml文件)的settings标签中

    
        
        
    

打开延迟加载的全局开关:设置lazyLoadingEnabled 为true
关闭积极加载的全局开关:设置aggressiveLazyLoading为false.
在这里插入图片描述

举个例子并且讲懒加载和积极加载做个对比.
这里是一个User表
07 MyBatis的懒加载和缓存机制_第1张图片
这是一个Order表
07 MyBatis的懒加载和缓存机制_第2张图片
很明显,Order中的外键是user_id,通过这个来进行关联.
再比如我们的需求是这个样子的:
对应的java Order对象是这样子,现在要通过订单number来进行查询Order,并且Order中还要有User.
但是数据库中我们的Order表中没有User,只有一个和它关联的外键.
07 MyBatis的懒加载和缓存机制_第3张图片
对应的mapper接口
07 MyBatis的懒加载和缓存机制_第4张图片
07 MyBatis的懒加载和缓存机制_第5张图片
首先通过getOrdersByNumber查询到Orders的属性,再根据外键user_id,加载深层次的user属性,
它加载了另一个select语句.
比如这里查询的number为 1000010,使用log4j跟踪日志信息
07 MyBatis的懒加载和缓存机制_第6张图片
可以看到执行了一次select后,返回了total为1,标识查询到一个结果
然后再执行一次更深层次的select.查找user 分为了两次

当关闭了懒加载,并且删除掉标签fetchType后,现在是默认的积极加载,
他会一次性加载出来结果
07 MyBatis的懒加载和缓存机制_第7张图片

二、缓存机制

mybatis默认开启的是一级缓存,mapper级别的,
就是在不同sqlSession下所存储的缓存被其他sqlSession是看不到的.

要开启二级缓存必须做到两个:
1.返回的对象必须实现序列化
2.只需要在SQL配置文件中添加一个标签就行 在这里插入图片描述
在这里插入图片描述
对于mapper.xml映射文件中的cache标签有如下几项配置,都是可选的

在mapper文件中开启了二级缓存后,所有的sqlSession之间共享数据,
并且每条SQL语句可以自定义是否使用二级缓存,是否刷新缓存.