上图是DefaultSqlsessio中的类中,可以看到执行查询结果的是否,是Configuration中获取的MapperStatement对象,那么什么时候向Configuration中注册这个的呢?答案是扫描Mapper接口时候,这其实是第二篇中没有分析的,现在单独拿出来分析一下, 上面这段代码是MapperRegistry这个类中注册的Mapper的代理工厂,如果对于Mapper的加载过程不清楚的,可以看之前分析的 mybatis-plus源码解析(二)----基于@MapperScan注解扫描加载Mapper, 这里是代码中的对象是MapperAnnotaionBuilder,可以看出是的通过注解的方式注册MapperStatement对象,下面看一下MapperAnnotaionBuilder这个对象,是怎么解析

首先可以看到初始化这个这个类的时候,默认会解析的注解有八种,分别是@Select, @Insert @Update,@Delete等,接下来主要看一下parse函数的解析过程

如果当前类没有加载过,则首先加载器xml的资源,然后将这个资源加入到已经加载的缓存中去,然后是用MapperBuilderAssistant设置当前命名空间,接着处理缓存和缓存引用,最重要的就是是parseStatement,主要解析注解属性。生成SqlSource,并组装成MapperStatement的,注入的configuraion。 这个方法首先获取参数类型和sql语法驱动类,并且注解属性构造出SqlSource, 这里可以看出MapperStatementId其实类全名+方法的名组成的,接下来Mapper接口的方法上可以@Optional这个注解来选择使用key生成器,以及管理缓存更新策略等。 在看一下@ResultMap这个注解的作用,主要是映射结果Map的,这些做完了,这些做完,接下来最重要的是MapperBuilderAssistant类调用addMappedStatement方法,向Configuration中注册MapperStatement, 这里处理MapperStatement很简单,只是调用了MappedStatement.Builder这个建造者构造MapperStatement,并向Configuration中注册。

此处本来一直用一张图来说明的这个流程,但是好像暂时没有找到好用的画图工具。以后再补上。

总结: 今天主要分析mybatis中环境配置中,MapperSatement的注册的主要过程。 下一次主要mybatis处理查询结果集的类型转换。