Mybatis懒加载和缓存

懒加载(lazyload)
但是有时候我们并不是一定要获取商品类型的信息,而是只想查出商品表里面的非外键属性,比如商品的名称价格等等,此时我们就可以考虑配置懒加载(通常将懒加载设置为false,也就是不懒加载,立即抓取)
比如说,存在两张表
商品类型和商品表
T_type
type_id type_name
1 食品
2 日用品
3 文具
T_goods
goods_id goods_name goods_type
1 卫龙辣条 1
2 臭豆腐 1
3 水杯 2
4 钢笔 3
普通查询方式(默认方式,不管有没有需要用到外键对象的值,都去主表中进行查询)
Mybatis懒加载和缓存_第1张图片

配置按需加载方式:

Mybatis懒加载和缓存_第2张图片

如果只需要非外键字段的数据时,不需要再查询主表
Mybatis懒加载和缓存_第3张图片

而当我们需要用到外键对象时,再对主表进行查询

Mybatis懒加载和缓存_第4张图片

Mybatis缓存
一级缓存:Sqlsession级缓存(默认开启的缓存)
特点:
1在同一个sqlsession下,对同样的sql语句查询都有做缓存。
2 在两个相同sql查询语句期间,如果对该表进行增删改的操作(java语句操作),那么该表缓存会清空。
3 如果不是同一个sqlsession,那么一级缓存失效。
二级缓存:跨Sqlsession级缓存(需要手工配置)
缓存搜索顺序:
每次查询先看是否开启二级缓存,如果开启从二级缓存的数据结构中取缓存数据,如果从二级缓存没有取到,再从一级缓存中找,如果一级缓存也没有,从数据库查询,并保存到相应级别的缓存中。
二级缓存的配置步骤:
1 在总的配置文件中,设置二级缓存生效
在这里插入图片描述

2 在对应的mapper文件中,设置二级缓存节点

在这里插入图片描述

3 对要存入缓存的实体类实现序列化接口
Mybatis懒加载和缓存_第5张图片

Cache节点属性的说明
flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用增删改语句时刷新。
size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
Eviction 缓存的移除策略:
LRU最近最少使用的:移除最长时间不被使用的对象。
FIFO先进先出:按对象进入缓存的顺序来移除它们。
SOFT软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象

你可能感兴趣的:(框架学习,mybatis)