延迟加载与缓存
一、延迟加载
1、直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。
2、侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。
侵入式延迟的配置:
(1)配置mybatis-config.xml文件
在mybatis-config.xml文件中插入setting节点,并设置name属性和value属性值,配置lazyLoadingEnabled

(2)小配置文件中select语句必须为两条

(3)Test测试类

(4)执行结果如下(当不掉用对象中的字段或属性时只执行一条SQL)

当调用其属性时执行的结果如下

3、深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。
深度延迟的配置:
(1)配置mybatis-config.xml文件,在mybatis-config.xml文件中插入setting节点,并设置name属性和value属性值,配置aggressiveLazyLoading

(2)Test测试类

当不调用对象时执行结果如下

当调用其中对象时执行结果如下

二、缓存
1、为什么使用缓存
查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度。
2、缓存说明
MyBatis查询缓存的作用域是根据映射文件的namespace划分的,相同的namespace的mapper查询数据放在同一个缓存区域。不同namespace下的数据互不干扰。
无论是一级缓存还是二级缓存,都是按照namespace进行分别存放的。
一级、二级缓存的不同之处在于,SqlSession一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不复存在。而二级缓存的生命周期与整个应用同步,与SqlSession是否关闭无关。换句话说,一级缓存是在同一线程(同一SqlSession)间共享数据,而二级缓存是在不同线程(不同的SqlSession)间共享数据。
3、一级缓存
(1)当同一个会话(SqlSession)执行两条相同SQL语句的时候,控制台只发送一条SQL


(2)增删改对一级缓存的影响
在Dao层中添加update修改方法

Test测试类
import com.user.dao.ISmbmsRoleDao;
import com.user.entity.SmbmsRoleEntity;
import com.user.entity.SmbmsUserEntity;
import com.user.util.mysyutil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class CollectionTest {
@Test
public void getRoleAndUserTest(){
SqlSession sqlSession = mysyutil.getSqlSession();
ISmbmsRoleDao mapper = sqlSession.getMapper(ISmbmsRoleDao.class);
SmbmsRoleEntity role = mapper.getRoleAndUser(3);
//当不调用字段时,只执行一条SQL语句
System.out.println("角色:"+role.getRoleName());
/* for (SmbmsUserEntity user: role.getUserList()){
System.out.println("\t用户:"+user.getUserName());
}*/
System.out.println("================================修改的方法=====================================");
mapper.UpdataList(3);
sqlSession.commit();
System.out.println();
System.out.println("====================一级缓存证明存在=======================");
SmbmsRoleEntity role2=mapper.getRoleAndUser(3);
System.out.println(role2.getRoleName());
sqlSession.close();
}
}
运行结果如下

(3)一级缓存总结
MyBatis框架天然集成一级缓存
一级缓存查询依据为SQLID+SQL语句
增删改会清空一级缓存
4、二级缓存
(1)在大配置文件中添加二级缓存节点,默认为开启

(2)在小配置文件中添加<cache/>节点,默认走二级缓存

(3)在实体类中实现Serializable接口

(4)Test测试类(只走一条SQL语句)

(5)增删改也会对二级缓存发生影响,会清除SqlSession中的数据重新加载

执行结果如下

三、一级缓存和二级缓存的总结
1、一级缓存在增删改情况下,无论是否提交事务(SqlSession)都会重新执行数据库查询(清空缓存);
2、二级缓存在增删改的情况下,如果提交事务则会清空缓存重新查询,如果不提交则获取缓存数据。


浙公网安备 33010602011771号