目录
2. 二级缓存(SqlSessionFactory级别的缓存)
延迟加载
在查询一对象时,它相关联的对象的查询尽量往后延时查询,延时到我在程序需要访问相关系对象时,再查询相关联对象。
1. 局部延时加载
在association、collection标签有一个fetchType属性,该属性的默认值为eager(立即加载) fetchType="eager",如果想用延时加载设置fetchType=”Lazy”
2. 全局延迟加载
在核心配置文件中settings标签中的setting标签进行配置
所有的分表查询都使用延时加载,如果某一些不想使用延时加载,可以单独进行设置 fetchType="eager"
缓存机制
1. 一级缓存(Sql级别的缓存)
SqlSession类中有一个类似于 Map集合类型的属性.
Map<String,Object> cache=new HashMap<String,Object>();
当使用sqlSession查询时,先从缓存中寻找,如果没有就直接访问数据库,把查询出来的结果放到缓存中. getEmployeeById3(1) select * from employee where e_id=1,它会把查询条件当做key,把查询出来的结果做为值,放到cache中.
Cache.put(“e_id=1”,emp1);
第二次查询时getEmployeeById3(1) ,先从缓存中查找,如果存在e_id=1这个key,就直接把值取出并返回。
在两次查询之间做增、删、改,都会清空一级缓存
手动调用session.clearCache(); 也会清空一级缓存.
2. 二级缓存(SqlSessionFactory级别的缓存)
(1). 需要核心配置文件中开启二级缓存设置
(2). 配置那些查询使用二级缓存 在对应映射文件中加入<cache></cache>
(3). 实体类要实现序列化接口
@Test
public void tesSecondCache(){
SqlSession session1= MyBatisUtils.getSession();
EmployeeMapper employeeMapper1=session1.getMapper(EmployeeMapper.class);
Employee emp1=employeeMapper1.getEmployeeById3(1);
System.out.println("第一次查询:"+emp1.getName());
MyBatisUtils.close(session1);
SqlSession session2= MyBatisUtils.getSession();
EmployeeMapper employeeMapper2=session2.getMapper(EmployeeMapper.class);
Employee emp2=employeeMapper2.getEmployeeById3(1);
System.out.println("第二次查询:"+emp2.getName());
MyBatisUtils.close(session2);
}