概述
提示1:本文需在掌握动态代理基础后浏览,如果动态代理需要回顾可以看我的另一篇博客
提示2:本文以我之前写的工程为模板进行讲解,工程结构及代码可以看我的另一篇博客
1. 说在前头
2. sqlSessionFactoryBuilder的build()过程:解析mybatis配置文件得到拥有Configuration属性的DefaultSqlSessionFactory对象。先梳理一下大体流程,然后再进行源码分析
2.1 mybatis配置文件读取后作为IO输入流会作为参数调用SqlSessionFactoryBuild类的build方法;
2.2 mybatis配置文件输入流会被转为XMLConfigBuild对象的XPathParser类型parser属性,便于解析;
2.3 XMLConfigBuilder的parseConfiguration方法解析parser属性,也就是解析mybatis配置文件的各个标签,如environments、mappers标签;
2.4 主要是mappers标签的解析,一般mappers标签内使用package标签扫描整个dao包,最终在MapperRegistry类中执行addMappers方法,根据包名找到以 .class 结尾的字节码文件并得到接口的Class对象,将其放入knowMappers对象中。在放入knowMappers对象时会校验 .class 是否接口,是接口会放入knowMappers中,不是接口不会放入。
2.5 然后执行MapperAnnotationBuilder的loadXmlResource方法,根据Dao接口名加载对应mapper的xml文件,所以接口名和xml文件要同名,加载后解析xml文件;然后会在MapperBuilderAssistant类的setCurrentNamespace方法中检查mapper的xml文件namespace是否和接口名一致,不一致会抛出异常。
2.6 mapper文件校验通过后,执行XMLMapperBuilder类的configurationElement方法解析mapper文件各个标签,最终在XMLStatementBuilder类的parseStatementNode方法解析mapper文件的各个select | insert | update | delete标签得到mappedStatement对象。
总结:最主要就是XMLConfigBuilder的parseConfiguration方法对mybatis配置文件各个标签节点的解析以及XMLMapperBuilder类的configurationElement方法对mapper文件xxDao.xml解析生成mappedStatement对象。
3. sqlSession.getMapper以及执行Dao接口方法的过程,先梳理一下大体流程,然后再进行源码分析
3.1 getMapper方法最终会进入MapperProxyFactory的newInstance方法,返回一个动态代理对象;
3.2 执行Dao方法时,则会进入动态代理对象MapperProxy的invoke方法,会将Method类型对象结合接口以及Configuration对象得到包含SqlCommand和MethodSignature的MapperMethod对象;
3.3 然后会执行MapperMethod的execute方法;紧接着调用DefaultSqlSession的selectList方法,最终会根据sqlCommand的name从Configuration类的mappedStatements属性得到对应的mappedStatement;
3.4 然后执行BaseExecutor的query方法,接着执行SimpleExecutor的doQuery方法,最终执行PreparedStatementHandler的query方法。
总结:最主要就是三点:①通过MapperProxyFactory得到动态代理对象;②Method对象转为包含sqlCommand和MethodSignature属性的MapperMethod对象;③根据MappedMethod对象的信息得到MappedStatement,进而确定最终要执行的sql语句。
最后
以上就是妩媚小松鼠为你收集整理的mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的的全部内容,希望文章能够帮你解决mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复