MyBatis

3分钟阅读

原理

一级缓存和二级缓存

一级缓存

MyBatis 默认开启了一级缓存,一级缓存是在 SqlSession 层进行缓存的。即同一个SqlSession ,多次调用同一个 Mapper 和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。但是不同的SqlSession对象,因为不同的SqlSession都是相互隔离的,所以不同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。

一级缓存在 SqlSession 关闭或提交事务时会被清空。Spring与MyBatis整合时,MyBatis的一级缓存在没有事务存在的时候失效。

未开启事务情况下,每次查询,spring都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是没有起作用的。

开启事务情况下,spring使用 threadLocal 获取当前资源绑定同一个 sqlSession ,因此此时一级缓存是有效的。

二级缓存

二级缓存是 Mapper 级别的缓存,缓存在 SqlSessionFactory 层,在不同的session之间都可以共享相同的数据内容。默认二级缓存是不开启的,需要手动进行配置。

首先查询二级缓存,然后再查询一级缓存

Mapper 映射

Mapper 接口中定义一个方法时,MyBatis 会根据方法名和参数类型来查找对应的 XML 文件,并解析其中的 SQL 语句。

Mapper 接口的工作原理是 JDK动态代理,它会拦截Mapper接口中的所有方法调用,根据方法名和参数类型来查找对应的 XML 文件,获取对应的 MappedStatement 对象,解析其中的 SQL 语句,并将其转换为对应的SQL语句执行。

分页插件的原理

内存分页

插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。