理解MyBatis

单独从mybatis自身的实现上讲,大致分为解析配置文件调用两大模块,

解析配置文件

首先创建对应的主配置文件的reader,将reader传入SqlSessionFactory的构造器build中,

构造器中主要通过XmlConfigBuilder对主配置文件进行解析,

通过解析出properties,setting,plugin,environment,mappers等属性标签,将其存入Configuratin中的字段中.其中mappers标签的解析又专门交给了XMLMapperBuilder来解析

通过解析cache,resultMap,sql及专门为每个select,insert,update,delete单独创建XMLStatementBuilder解析成对应的MapperStatement对象并设置进Configuration中.

创建完sqlSessionFactory后,我们通过sqlSessionFactory调用openSession,得到SqlSession,而openSession中主要做的就是为我们创建对应的executor,根据缓存的设置不同,会有不同的创建流程,比如以开启二级缓存为例,首先会创建基础的executor,比如SimpleExecutor,ReuseExecutor,BatchExecutor,这些excutor都继承自baseExecutor,接着将创建好的基础executor传进CachingExecutor构造函数中,返回对应的cachingExecutor对象。这里也是通过装饰者模式和责任链模式来完成缓存机制,接下来调用的时候会提到,还有,如果有配置插件的话,还会将插件的执行链传入并创建代理对象,再和Confiuration一起封装到DefaultSqlSession中,返回对应的sqlSession,

有了sqlsession,我们就可以执行调用增删改查的接口了,进入调用阶段

通过传进的statementid我们可以从configuration中拿到对应的MapperStatement对象,接着传进去对应的mapperStatement和传进来的查询参数来调用executor的对应方法,

executor调用对应的增删改查方法中,如果是启用缓存机制,那么首先先调用CacheExecutor对应的方法,从CacheExecutor的存储字段先获取,如果没有,再调用CacheExecutor中存储的之前封装的基础executor的对应方法进行责任链的调用,这里就是装饰器+责任链完成缓存的机制,最后还会先到基础executor都继承自baseExecutor中查询一级缓存,如果没有再通过调用MappedStatement对象的getBoundSql方法拿到对应的boundsql,通过循环遍历mappedstatement对象中对应的SqlSource中的sqlnode,依次解析拼接完对应的sqlnode完成SQL语句的拼接,及解析完对应的参数。

准备好了sql及相关参数,接下来就是调用query方法通过jdbc原生的 一些api完成查询返回结果集,最后通过resultSetHandler对返回的结果集set和MappedStatement中ResultMap方法,一一对应创建出对应的对象返回.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值