延迟加载:

什么是延迟加载:

MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。

MyBatis根据对关联对象查询的select语句的执行时机,分为三种类型:直接加载、侵入式加载与深度延迟加载

直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询。
侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情访问中。也可以这样理解:将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情的一部分出现了。
深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。

直接加载:

1.主配置文件(Mybatis.xml)

全局属性lazyLoadingEnabled的值只要设置为false,那么,对于关联对象的查询,将采用直接加载。即在查询过主加载对象后,会马上查询关联对象。

lazyLoadingEnabled的默认值为false,即直接加载。

<settings>
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="false"/>
</settings>

2.mapper映射文件

<mapper namespace="com.hcx.dao.IMinisterDao">

<select id="selectCountryById" resultType="Country">
select cid,cname from country where cid=#{cid}
</select> <resultMap type="Minister" id="ministerMapper">
<id column="mid" property="mid"/>
<result column="mname" property="mname"/>
<association property="country"
javaType="Country"
select="selectCountryById"
column="countryId"/>
</resultMap> <select id="selectMinisterById" resultMap="ministerMapper">
select mid,mname,countryId from minister where mid=#{mid}
</select>
</mapper>

3.测试类:

当程序执行到断点处语句时,不仅对country表进行了查询,对minister表也同时进行了查询。

public class MyTest {

private ICountryDao dao;
private SqlSession session; @Before
public void setUp(){
session = MyBatisUtils.getSqlSession();
dao = session.getMapper(ICountryDao.class);
} @After
public void tearDown(){
if(session!=null){
session.close();
}
} @Test
public void test01(){
Country country = dao.selectCountryById(2);
//此处加断点
System.out.println(country);
System.out.println(country.getMinisters().size());
}
}

深度延迟加载:
修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading关闭(值为false)。

此时,只有当代码执行到输出Minister对象详情时,底层才执行select语句对minister表进行查询。

侵入式延迟加载:
修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading也开启(值为true,默认为true)。

<settings>
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>

测试类:

@Test
public void test01(){
Country country = dao.selectCountryById(2);
//此处加断点
System.out.println(country);
System.out.println(country.getMinisters().size());
}

当代码执行断点处语句时会立即查询country表,但每查询minister表。说明现在的延迟加载已经启动。
当对country对象的详情进行访问时,对minister表也进行了查询。因为该延迟加载策略已经将主加载对象的关联属性也作为主加载对象的基本信息了,而前面已经查询出了主加载对象的基本信息,但其关联对象基本信息尚无。所以,马上进行对minister表的查询。
换个角度来说,该延迟策略使关联对象的数据侵入到了主加载对象的数据中,所以称为侵入式延迟加载。

注意:该延迟策略也是一种延迟加载,需要在延迟加载开关lazyLoadingEnabled开启时才会起作用。若lazyLoadingEnabled为false,则aggressiveLazyLoading无论取何值,均不起作用。

原文链接:https://blog.csdn.net/qq_35242910/article/details/78136435

MyBatis缓存: 

使用缓存可以使应用更快地获取数据,避免和数据库的频繁地交互,尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用也就越明显。MyBatis作为持久性的ORM框架,提供了非常强大的查询缓存特性,可以非常方便的配置和使用。

  MyBatis查询缓存机制。根据缓存区的作用域与生命周期,可划分两种

  一级缓存

  二级缓存

MyBatis查询缓存的作用域是根据映射文件的namespace去划分的,相同的namespace的mapper查询放在同一个缓存区域。不同的namespace下的数据互不干扰。

无论是一级缓存还是二级缓存,都是按照namespace进行分别存放的。

一级、二级缓存的不同之处在于,SqlSession对象一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不复存在。

而二级缓存的生命周期与整个应用同步,与SqlSession是否关闭无关。

换句话说,一级缓存是在同一个线程(同一SqlSession)间共享数据,而二级缓存是在不同线程(不同的SqlSession)间共享数据。

一级缓存:

  • 一级缓存真实存在,无需配置
  • 一级缓存的依据是ID+SQL字句
  • 增删改会清空一级缓存

二级缓存:

  • 二级缓存不比一级缓存,需要在configuration.xml中手动开启。
  • 二级缓存是全局应用级别的缓存,即使关闭了session仍能使用。
  • 如果一个select标签想要局部关闭二级缓存,需要设置useCache=false
  • 二级缓存不能使用注解方法配置
  • 如果在执行增删改操作的过程中不刷新缓存,须设置flushCache=false

最新文章

  1. JavaScript分离代码理解
  2. linux琐碎知识点
  3. Android浏览本地 API文档 + 解决页面加载慢的问题
  4. 奥特曼小分队之四(Work Breakdown Structure)
  5. css中常用的hack
  6. php与mysql的链接到底用mysql 还是mysqli,pdo
  7. SOURCES的文件格式
  8. JQ中$(document.ready())
  9. 201521123054 《Java程序设计》 第十周学习总结
  10. fitnesse - 用例创建编辑、管理、执行和日志
  11. 【一天一道LeetCode】#86. Partition List
  12. kafka知识点详解
  13. linux 虚拟机配置固定ip
  14. js自执行事件
  15. 生产环境下JVM调优参数的设置实例
  16. /* * 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 *(包括学生号,姓名,三门课成绩),计算出平均成绩, *将原有的数据和计算出的平均分数存放在磁盘文件&quot;stud&quot;中。 */
  17. SQL Server表分区(水平分区及垂直分区)
  18. 【BZOJ1802】[AHOI2009]checker(动态规划)
  19. CCF-CSP 201312-5 I&#39;m stuck !
  20. Hive/hbase/sqoop的基本使用教程~

热门文章

  1. 【WPF学习】第三十九章 理解形状
  2. Huffman编码和解码
  3. 基于python2+selenium3+pytest4的UI自动化框架
  4. 纯JavaScript实现页面行为的录制
  5. OpenCV3入门(九)图像几何变换
  6. 青石巷-小L的爸爸
  7. 13-MyBatis03(逆向工程)
  8. NPOI word文档表格在新的文档中多次使用
  9. STM32,ARM,Keil工具相关
  10. Apache httpd.conf配置文件 2(Main server configuration)