Mybatis延迟加载&缓存机制

目录

延迟加载

1. 局部延时加载

2. 全局延迟加载

缓存机制

1. 一级缓存(Sql级别的缓存)

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);


    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis的三级缓存机制指的是MyBatis在执行SQL语句时,会默认启用三级缓存,以提高查询性能。 三级缓存分别是: 1. 一级缓存:也称为本地缓存,指的是MyBatis在同一次会话中执行相同SQL语句时,会将结果缓存到内存中,下次查询相同的SQL语句时,直接从缓存中读取结果,而不会再次执行SQL语句。一级缓存的作用域是会话级别的。 2. 二级缓存:也称为全局缓存,指的是MyBatis在多次会话中执行相同SQL语句时,会将结果缓存到内存中,下次查询相同的SQL语句时,直接从缓存中读取结果,而不会再次执行SQL语句。二级缓存的作用域是Mapper级别的。 3. 三级缓存:也称为分布式缓存,指的是MyBatis在多个应用程序之间共享缓存,以提高查询性能。三级缓存的作用域是全局级别的,需要使用第三方缓存组件来实现。 需要注意的是,三级缓存在默认情况下是关闭的,需要手动开启。开启方法如下: 在mybatis-config.xml文件中添加如下配置: ``` <settings> <setting name="cacheEnabled" value="true"/> <setting name="localCacheScope" value="SESSION"/> <setting name="lazyLoadingEnabled" value="true"/> </settings> ``` 其中,cacheEnabled表示是否开启缓存,localCacheScope表示一级缓存的作用域,lazyLoadingEnabled表示是否启用延迟加载。 需要注意的是,开启二级缓存时,需要在Mapper.xml文件中添加如下配置: ``` <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> ``` 其中,type属性指定了缓存的类型,这里使用了EhcacheCache。需要在项目中添加Ehcache的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值