延迟加载
什么是延迟加载:
MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。
加载时机:
直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。
侵入式延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。但 当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。
深度加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。
侵入式延缓存:
Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置侵入式加载
不调用主加载对象时只有一条SQL
调用主加载对象的信息时会产生两条SQL
深度延迟缓存:
Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置深度加载
调用主加载对象时不会执行第二条加载SQL
调用关联对象详细信息时会执行第二次查询
mybatis缓存
一级缓存
一级缓存是基于PerpetualCache(MyBatis自带)的HashMap本地缓存,作用范围为session域内,当session flush或者close之后,该session中所有的cache就会被清空。
缓存的底层实现是一个Map,Map的key是查询的依据,使用的ORM框架不同,查询依据也不同,Mybatis查询依据为SQL的ID+SQL语句,hibernate的为查询结果对象的ID
证明一级缓存的案例:
在第一次查询时,走数据库查询,并将数据放入缓存,进行第二次查询时,走缓存查询数据,所以值执行一条SQL;
增删改对缓存的影响:
在一级缓存中,无论是否事务提交,都会重新进行数据库查询;
事务提交时将一级缓存的数据清空;
结论:
一级缓存真实存在,无需配置
一级缓存的依据是Id+SQL语句;
增删改会清空一级缓存
二级缓存
二级缓存就是global caching,它超出session范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心文件(mybatis-config.xml)settings中设置即可。
一级缓存的缓存就是SQL语句,二级缓存的缓存是结果对象。
pom.xml文件配置:
<!--引入需要的ehcache插件-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.2.3</version>
</dependency>
<!--mybatis整合ehcache的jar-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.0</version>
</dependency>
在mybatis-config.xml中开启二级缓存
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
在小配置xml文件增加cache节点
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
实体实现Serializable(标志接口:没有任何方法)
测试:
结果:
增删改对缓存的影响:
进行事务提交:
不进行事务提交:
关闭刷新缓存
在增删改对应小配置节点内,加入flushCache值为false,默认值为true;
在select语句中默认值为false,在第一次进行查询时,进行数据库查询,后续相同的查询,就进行缓存查询。、
查询不应用缓存
不应用缓存代表会再次发送SQL查询数据