2022面试题——MyBatis

MyBatis

1.简述MyBatis缓存

mybatis有一级缓存和耳机缓存,默认开启的事一级缓存,一级缓存是sqlSession级别的,二级缓存与具体的命名空间绑定。

2.一级缓存执行过程

  • 发起查询请求时会先去查询一级缓存中是有存在结果,如果存在则直接返回,如果不存在则查询数据库,将查询到的结果放入一级缓存,供下次查询使用。
  • 当sqlSession执行了commit操作后将会清空一级缓存,以保证缓存中的数据是最新的,避免脏独。

3.mybatis缓存的执行过程

默认开启一级缓存,执行查询时先去查二级缓存,未命中则查询一级缓存,一级缓存未命中差数据库。

4.如何开启二级缓存

  • 开启全局二级缓存配置, 标签中进行配置,name=“cacheEnabled”,value=“true”;
  • 在需要使用二级缓存的mapper文件中配置标签,;
  • 在CRUD标签上配置,例如在标签上配置useCache=“true”。

5.二级缓存存在问题

一旦数据变更,mybatis会清空缓存,因此二级缓存不适用于经常更新的数据,只适用于不常进行增、删、改的数据。

6.mybatis延迟加载简述

延迟加载也叫做懒加载,就是用到数据时才进行查询加载,不要用到时不进行加载。

7.mybatis延迟加载优缺点

  • 优点:先从单表查询,需要时再从关联表查询,大大提高了数据库性能,因为查询单表要比关联查询多张表速度要快。
  • 缺点:因为只有在用到数据时,才会查询数据库,这样在大批量的数据查询时,查询工作也会消耗时间,造成响应请求慢,等待时间长的问题。

8.延迟加载和立即加载适用场景

  • 延迟加载:在一对多、多对多时采用;
  • 立即加载:在一对一,多对一时采用。

9.局部加载时实现方式

通过修改 association 和 collection 标签中的 fetchType 属性,可以控制局部加载策略。

  • 例如:
    fetchType=“lazy” 懒加载策略
    fetchType=“eager” ⽴即加载策略

10.全局加载实现方式

在Mybatis的核⼼配置⽂件中可以使⽤setting标签修改全局的加载策略,name=“lazyLoadingEnable”, value=“true”。

11.延迟加载原理

延迟加载主要是通过动态代理的形式实现,通过代理拦截到指定⽅法,执⾏数据加载。
它的原理是,使⽤ CGLIB 或 Javassist( 默认 ) 创建⽬标对象的代理对象。当调⽤代理对象的延迟加载属性的 getting ⽅法时,进⼊拦截器⽅法。⽐如调⽤a.getB().getName()⽅法,会进⼊拦截器的invoke()⽅法,发现a.getB()需要延迟加载时,那么就会单独发送事先保存好的查询关联 B对象的 SQL ,把 B 查询上来,然后调⽤ a.setB(b) ⽅法,于是a对象的b属性就有值了,接着完成 a.getB().getName() ⽅法的调⽤。

你可能感兴趣的:(2022面试题总结,mybatis,java,缓存)