Mybatis框架
连接数据库层的框架,是ORM类型的框架(对象关系映射类型)
ORM:用于实现面向对象编程语言里不同类型系统的数据之间的转换
其实就是将java和mysql类型一一对应。
Mybatis底层实现:
有几种方式解析mappers文件(加载映射),加载方式
答:4种
1.resource 使用相对于类路径的资源引用 <mapper resource="org/mybatis/builder/Authormapper.xml"/>
2.url 使用完全限定资源定位符(URL),例如 <mapper url="file:///var/mappers/Authormapper.xml"/>
3.class 使用映射器接口实现类的完全限定类名 <mapper class="org.mybatis.builder.Authormaaper"/>
4.package 将包内的映射器接口完全全部注册为映射器 <package name=''org.mybatis.builder" />
优先级: package最高
Mybatis是如何获取sql的
Mybatis有多少种执行器
三种:simple(默认) reuse batch
Mybatis有三种基本的Executor执行器: 都继承BaseExecutor
SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
一级缓存是开启的
问题:A系统sql ,B系统判断sql是否正确? 答:语法引擎会去改写sql,把占位符的sql会变成?号格式的sql,jdbc可以识别?号
MyBatis缓存:作用(优点):提高查询的效率和减少数据库的压力,MyBatis也有一级缓存和二级缓存,还预留了集成第三方缓存的接口
MyBatis缓存都在cache包里面,其中有一个cache接口,只有一个默认的实现类Perpetualcache
所有的缓存实现类总体上可分为三类:基本缓存、淘汰算法缓存、装饰器缓存。
一级缓存也叫本地缓存,MyBatis的一级缓存是在会话(sqlSession)层面进行缓存的,默认开启的也是一级缓存,每当我们使用MyBati开启一次和数据库的会话,MyBatis会创建一个SqlSession对象表示一次数据库会话。
一级缓存
一级缓存的生命周期?
- 开启一次会话创建一个新的SqlSession对象,SqlSession对象钟会有一个新的Executor对象,Executor对象,就会有一个新的PerpetualCache对象,当会话结束时,sqlSession对象及内部的Executor对象还有PerpetualCache对象一起释放
- 如果sqlsession调用close()方法,会释放一级缓存PerpetualCache对象,一级缓存不可以用
- 如果SqlSession调用clearCache(),会清空PerpetualCache对象数据,但是该对仍可以使用
4.SqlSession中执行任何一个update操作(update(),delete(),insert()),都会情况PerpetualCache对象数据,但是该对象可以继续使用
SqlSession一级缓存的工作流程
- 对于某个查询,根据StatementId,params,rowBounds来构建一个key值,根据这个key值去缓存cache中取出对应值存储缓存结果
- 判断从Cache中根据特定的key值取的数据数据是否为空,即是否命中;
如果命中,则直接将缓存结果返回;
. 如果没命中: 去数据库中查询数据,得到查询结果; 将key和查询到的结果分别作为key,value对存储到Cache中;将查询结果返回
同一个session中共享(不同session不能共享)
一级缓存缺点:缓存不能跨会话共享,不同的会话之间对于相同的数据可能有不一样的缓存
在有多个会话或者分布式环境下,会存在脏读数据的问题,这个问题可以使用二级缓存解决
二级缓存
二级缓存是来解决一级缓存不能跨会话共享的问题,范围是namespace级别的,可以被多个sqlsession共享(只要是同一个接口里面的相同方法,都可以共享),生命周期和应用同步,如果你的myBatis使用二级缓存,并且Mapper和select语句也配置使用二级缓存,那么在执行查询的时候,会先从二级缓存中取出输入,其次才是一级缓存,mybatis查询数据顺序是:二级缓存---->一级缓存---->数据库
- 实际上Mybatis用了一个装饰器的类来维护,就是cachingExecutor,如果启动了二级缓存,MyBatis在创建Executor对象的时候会对Executor进行装饰,CachingExecutor 对于查询请求,会判断二级缓存是否有缓存结果,如果有就直接返回,如果没有委派交给真正的查询器Executor 实现类,比如SimpleExecutor 来执行查询,再走到一级缓存的流程。最后会把结果缓存起来,并且返回给用户。

浙公网安备 33010602011771号