Mybatis的整体理解
I有关于我的对ybatis的设想:
简单总结-下有关于我对wybat is的架构理解:
总体分为三个层面:
1.对外接口API
2.MapStatement数据处理
3.执行及其数据存储
两个主要的对象apperStatemnent (从xm1解析出来的信息,stattementid (namespace+方法名〉,对象的路径主要使用:
sq lsession :主要功能获取会话,数据交互。
executor :执行器负责sq l的执行。由sinp leExecuter(默认的主要执行器),BacthExecnter,ReuseExecutorstatementHandler : jdbc的封装,设置参数,以及把结果集进行封装。
paremeterHandler :对传递过来的参数set到statement内。
resultSetHandler :负责把jdbc封装的结果集转化为list
typeHandler :负责Java和数据类型,jdbc数据类型的转换
apperStatement :把mapper内的增删改查xm1解析出阿里。
Sqlsource :把传入的参数对象和解析sq1语句送到bandsql。
bandsql :负责动态生成sql和参数形象
主要实现代理模式,工厂模式,构建模式
缓存部分
一级缓存:
在sqlSession的范围内,对从数据库获取的数据进行缓存,在每次dml操作时做刷新。sqlsession关闭
当前缓存结束。
二级缓存:
在mapper层级内,对多个sqlsession所共享的查询缓存资源,同一个mapper下的查询都会被缓存进来,但是把一级缓存存到二级缓存是在sqlsession结束以后,close之后,才会进行flush的刷新操作。
当然没有进行过dml操作,以及执行的查询操作有缓存的情况下不手动刷新也是不会刷新的。
一级缓存和二级缓存都是使用hashmap作为结构进行操作的。一级缓存默认开启二级缓存需要手动。
但是二级缓存过于鸡肋,一般使用其他三分作为二级缓存,例如redis。(mybatis和redis是有相关的集成)使用二级缓存要把所有的实体类序列化,因为他们是可以被存在银盘上的。
缓存使用的key有多个部分:statementID,参数列表,封装结果集。组合,所用的值为获取到的数据集合,list而不是实体类。
自定义插件
mybatsi的方法增强。
主要可以对一下四个组件进行拦截,使用拦截标签。
ececuter
statementHandler
paramterHandler
resultsethandler
使用拦截标签后再拦截犯法前后进行相关的处理逻辑
记得要拿自己的拦截配置到sqlmapper.xml中