Mybatis原理
sqlsessionFactoryBuilder生成sqlsessionFactory(单例)
工厂模式生成sqlsession执行sql以及控制事务
Mybatis通过动态代理使Mapper(sql映射器)接口能运行起来即为接口生成代理对象将sql查询到结果映射成pojo
MyBatis 使用 JDK 的动态代理
sqlSessionFactory构建过程
解析并读取配置中的xml创建Configuration对象 (单例)
使用Configuration类去创建sqlSessionFactory(builder模式)
Mybatis一级缓存与二级缓存
一级缓存是指 SqlSession 级别的缓存
原理:使用的数据结构是一个 map,如果两次中间出现 commit 操作 (修改、添加、删除),本 sqlsession 中的一级缓存区域全部清空
二级缓存是指可以跨 SqlSession 的缓存
是 mapper 级别的缓存; 原理: 是通过 CacheExecutor 实现的。CacheExecutor其实是 Executor 的代理对象
默认情况下一级缓存是开启的,而且是不能关闭的
Mybatis缓存
一级缓存
SESSION(MyBatis默认是这个), SqlSession级别的缓存
STATEMENT,只对当前执行的这一个Statement有效
什么时候会失效?
有修改和新增操作后,会重新查库,不会使用Sqlssion中缓存的值
缺点
MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。
二级缓存
如果多个SqlSession之间需要共享缓存,则需要使用到二级缓存
二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
有一个面试官说这个就是Mapper级别的缓存,也没有问题
其他
个人建议MyBatis缓存特性在生产环境中进行关闭,单纯作为一个ORM框架使用可能更为合适