我是靠谱客的博主 妩媚小松鼠,最近开发中收集的这篇文章主要介绍mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提示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语句的所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部