单独从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方法,一一对应创建出对应的对象返回.