Mybatis
IT面试
445 ·
0 ·
2023-02-08 16:45:56
最新编辑原因:

Mybatis原理

  1. sqlsessionFactoryBuilder生成sqlsessionFactory(单例)

  2. 工厂模式生成sqlsession执行sql以及控制事务

  3. Mybatis通过动态代理使Mapper(sql映射器)接口能运行起来即为接口生成代理对象将sql查询到结果映射成pojo

MyBatis 使用 JDK 的动态代理

sqlSessionFactory构建过程

  1. 解析并读取配置中的xml创建Configuration对象 (单例)

  2. 使用Configuration类去创建sqlSessionFactory(builder模式)

Mybatis一级缓存与二级缓存

一级缓存是指 SqlSession 级别的缓存

原理:使用的数据结构是一个 map,如果两次中间出现 commit 操作 (修改、添加、删除),本 sqlsession 中的一级缓存区域全部清空

二级缓存是指可以跨 SqlSession 的缓存

是 mapper 级别的缓存; 原理: 是通过 CacheExecutor 实现的。CacheExecutor其实是 Executor 的代理对象

默认情况下一级缓存是开启的,而且是不能关闭的

Mybatis缓存

一级缓存

  • SESSION(MyBatis默认是这个), SqlSession级别的缓存

  • STATEMENT,只对当前执行的这一个Statement有效

  • 什么时候会失效?

    1. 有修改和新增操作后,会重新查库,不会使用Sqlssion中缓存的值

  • 缺点

    1. MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。

二级缓存

如果多个SqlSession之间需要共享缓存,则需要使用到二级缓存

二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

有一个面试官说这个就是Mapper级别的缓存,也没有问题

其他

个人建议MyBatis缓存特性在生产环境中进行关闭,单纯作为一个ORM框架使用可能更为合适


本作品系原创,采用《署名-非商业性使用-禁止演绎4.0 国际》许可协议.转载请说明出处
本文链接:https://www.upupor.com/u/lDXWPjw 复制

无内容

推荐阅读