一、MyBatis缓存
1.1 概念
在客户进行查询操作时,往往可能对重复的查询执行很多次,mybatis提供了默认的缓存机制一级缓存、二级缓存其中一级缓存默认开启,二级缓存需要进行配置才能进行使用,将查询的结果放置至对应的缓存,在用户重复查询时可以直接获取上一次的结果(在没有进行修改的情况下)
1.2 一级缓存
在mybatis核心配置文件中设置相应的配置开启缓存默认会直接开启一级缓存,将查询的数据缓存至当前的sqlsession会话中,当对同一sql语句进行多次查询时,除第一次进行查询外,其余直接获取当前缓存中的数据(没有被修改的前提下)
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
mybatis为了提高用户的查询效率,会将一级缓存存储在客户连接的sqlsession中。同一个sqlsession默认会使用同一个查询的结果
1.3 二级缓存
由于二级缓存是所有的sqlsession都可以访问,如果将所有的查询结果都保存可能造成数据的溢出,所以mybaits提供了2种共同实行的解决方案,首先需要对开启二级缓存的mapper进行设置,并且提供可以与第三方存储联合的方法,将缓存存储至像是radis这样的内存服务器中(默认存储在服务器中)
开启二级缓存只需要在对应mapper中书写cache标签(无属性)
<!--开启二级缓存 默认存储在当前系统内存中-->
<cache/>
注意:二级缓存会将结果存储在内存中,所以需要存储数据实现序列化接口,并且只有在当前的sqlsession使用结束,才会将一级缓存数据推送至二级缓存
二、MyBatis延迟加载
2.1 概念
在进行查询时只将核心数据进行查询(不将所有数据全部查询),而是在达到指定触发条件时自动调用查询返回结果。
常用于多个表之间的对应关系
2.2 书写
使用的是resultMap 集合映射与类映射的三个属性
select:指向其他mapper的查询语法是namespace.id
column:调用其他查询时需要传入的参数(使用已有查询结果列进行使用)
fetchType: 设置延迟加载样式
lazy深入式 :只有使用到对应属性时才进行查询(根据需要使用的属性进行查询)
eager侵入式:无延迟加载直接执行将数据查询
<resultMap id="user" type="com.yunhe.vo.User">
<association property="role" column="uid" select="com.yunhe.mapper.RoleMapper.selectByUid" fetchType="lazy"/>
</resultMap>