一、延迟加载
延迟加载即加载延迟了,并不是一次性加载完而是按需加载,感觉应该是针对多表查询而言的,即先查询单表等需要另一张表的信息时再去加载,这样能提高数据库的性能;
需要注意的是,mybatis提供的输出映射(即返回结果隐射)的两种属性resultType和resultMap,其中只有resultMap支持延迟加载;而resultType是通过ssociation或collection标签来实现的,具体实现的关键代码如下:
<resultMap id="testLazyLoading" type="最终映射的javabean">
<!-- 配置id和result标签 -->
......
<!-- 配置association实现延迟加载 -->
<association property="" javatype="" select="指定需要延迟加载的sql对应的statement的id" column="select标签中sql查询的参数">
</association> </resultMap>
最后,mybatis是不支持延迟加载的,需要在其配置文件sqlMapConfig中进行全局的配置,关键代码如下:
<!-- SqlMapConfig.xml中的全局配置 -->
<settings>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/> <!-- 按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
二、缓存
1、一级缓存
一级缓存即SqlSession缓存,mybatis是默认开启的,所以一般不需要我们刻意去维护
2、二级缓存
二级缓存是Mapper级别的缓存,是可以跨SqlSession的;二级缓存的使用是需要我们自己在配置文件中手动开启,具体如下:
先在SqlMapConfig中进行配置,代码如下:
<setting name="cacheEnabled" value="true"/>
然后在需要使用二级缓存的mapper的配置文件中开启二级缓存,代码如下
<!-- 开启当前mapper下的二级缓存 -->
<cache/>
<!-- 注意,cache标签可以继续配置用于实现二级缓存的整合,即不用mybatis提供的二级缓存用第三方的 -->
最后,二级缓存中调用的javabean需要实现序列化(Serializable)接口,这是为了将缓存数据取出执行反序列化操作,因为二级缓存数据的存储地不一定全部在内存
注意:缓存开启的过程中,如果一旦进行了事务的commit操作,即对数据库进行了增删改,那么为了避免脏数据的出现,默认情况下是会刷新缓存区域的(即清空缓存)