Mybatis缓存机制
Mybatis定义了两级缓存,一级缓存和二级缓存,
一级缓存,即本地缓存,作用域默认为sqlSession,本地缓存不能关闭,但是可以清空,同一次会话期间只要查询过的数据都会保存在当前sqlsession的一个map中,
一级缓存失效的情况如下
二级缓存,全局作用域的缓存,默认是不开启的,Mybatis提供二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口,二级缓存sqlSession关闭或提交之后才会生效
//全局配置文件开启二级缓存
<setting name="cacheEnabled" value="true"/>
//对应的映射文件使用caceh配置,且对应的对象要实现Serializable
<cache />
cache标签重要属性的含义
evication | 缓存回收策略 | LRU,对近最少FIFO,先进先出,按照进入缓存的顺序删除SORT,软引用,移除垃圾回收器和软引用规则的对象WEAK(移除基于垃圾收集器装器和弱引用规则的对象) |
---|---|---|
flushInterval | 刷新间隔单位毫秒 | 默认不设置,没有刷新间隔,缓存仅仅调用语句时候刷新 |
size | 缓存的对象多少 | |
readOnlya | 只读 | true:会给所有调用者返回缓存对象的相同实例,因为这些对象不能被修改false.会返回缓存对象的拷贝, |
缓存的有关配置
可以使用第三方缓存框架如EhCache
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
当一条sql执行的时候,先从二级缓存中查询,再到一级缓存查询,最后走到数据库查询.
Mybatis工作原理
Mybatis插件开发
在Mybatis四大对象创建的时候,都会有插件的进行介入,插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象方法之前进行拦截的效果
开发步骤如下
插件原理
#{}和${}区别
Mybatis映射文件中,如果标签A通过引用B标签的内容,请问,B标签能否在A标签后面,还是说必须定义在标签A的前面
虽然Mybatis解析XML映射文件是按照顺序解析的,但是被引用的标签B依然可以定义在任何地方,因为当解析到标签A的时候,发现标签B尚未解析到,可以标记标签A为未解析,然后继续解析其他标签,当所有标签解析完毕之后,Mybatis会重新解析那些标签未解析的标签,此时在解析A标签时候,标签已经存在,A标签也就可以正常解析了
Mybatis有哪些Executor执行器,他们之间的区别是什么
Mybatis有三种基本的Executor执行器
Mybatis是否支持延迟加载,如果支持,他的实现原理是什么
Mybaits仅支持association关联对象和Collection关联集合对象的延迟加载,association指的是一对一,collection指的是一对多查询,Mybatis配置文件中,可以配置是否开启延迟加载,lazyLoadingEnabled=true|false
他的原理是,使用CGLIB创建目标对象的代理,当调用目标对象的时候,进入拦截方法,比如调用a.getB().getName().当拦截器发现a.gerB对象时null的时候,就会单独发送事先保存好的查询B对象的sql,把对象B查询上来之后,然后调用a.setB(b),于是a就可以获取B对象,接着完成getName()调用,值就是延迟加载
持续关注,下一篇分布式全面总结,如果对您有一丝丝帮助,麻烦点个关注,也欢迎转发,谢谢