mybatis常见面试题
#{}和${}的区别是什么?
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set方法来赋值;能够防止sql注入.
Mybatis 在处理\({}时,就是把\){}替换成变量的值。
mybatis的一级缓存和二级缓存
1。缓存的作用
缓存的作用:减低数据源的访问频率。从而提高数据源的处理能力。或者提高服务器的响应速度
2。MyBatis中的缓存设计
-
MyBatis中的缓存的架构设计:装饰器模式
-
MyBatis中的一级缓存和二级缓存
-
一级缓存:session级别
一级缓存是SqlSession级别的缓存,它默认是开启的,当同一个sqlsession执行相同的sql语句时,会先从缓存中查找,如果找到了对应的结果。则直接返回缓存中的结果,而不会再次访问数据库。
在实际项目开发中一级缓存一般没有什么作用。
要关闭一级缓存:
//还有一个值是SESSION,也就是默认是开启的。 -
二级缓存:SqlSessionFactory级别
二级缓存是Mapper级别的缓存(说白了就是进程级别的缓存),它默认是关闭的。当不同的sqlsession执行相同的sql语句时,如果开启了二级缓存,则会先从缓存中查找,如果找到了对应的结果,则直接返回缓存中的结果,而不会再次访问数据库。
要开启二级缓存:
首先是在全局配置文件中设置:
然后要在具体的映射文件中设置cache标签
如果映射文件中的某个方法不想开启缓存可以设置useCache = "false"处理。
缺点:二级缓存在单体架构中是不会出现问题的,但是在集群架构中就可能会出现数据不一致的问题。
- 三级缓存:需要我们自定义实现,需要重写一个Cache接口。
缓存的设计
通过装饰模式实现缓存功能扩展
缓存的应用
一级缓存和二级缓存
一级缓存和二级缓存的顺序问题:先二级缓存再一级缓存
为什么会先走二级缓存再走一级缓存?
二级缓存的作用域是SqlSessionFactory级别-90%找到
一级缓存是SqlSession级别的-5%找到
一级缓存和二级缓存底层默认都是基于PerpetualCache来实现的,底层用的是HashMap.
Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么
底层基于CGLIB来实现。
标签:面试题,缓存,一级,常见,二级缓存,sql,mybatis,级别 From: https://www.cnblogs.com/dongyaotou/p/18405070