一、延迟加载
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、二级缓存在增删改的情况下,如果提交事务则会清空缓存重新查询,如果不提交则获取缓存数据。