有了前三讲的基础,我们知道mybatis的架构,mybatis的xml解析,Configuration的解析等知识的奠基。我们今天就来深刻探讨一下MappedStatement是个啥东西,有啥作用。
我们现在来思考一下,看下这两个东西:
我们写的一个接口和这个xml的mapper文件,是怎样结合起来的?
我们只要用过mybatis,我们应该都知道mybatis有一个这样的一个流程:
我们就从源码的角度来看待这个问题吧
这个截图,我们在第三讲是有截图的,就是解析了XML之后,会得到这些参数信息,最后利用建造者模式builder出来,最后把这个MappedStatement放在Configuration中
我们可以猜测一个这个ms.getId()是什么东西?
没错,正是我们的namespace+我们接口的方法名,这样就能把我们的接口和mapper的xml关联在一起了。
我们的sqlSessionFactory就算是构建完成了,下面就要掉我们的openSession来打开我们的openSession了,进去看一看
有了SqlSession之后,我们就可以调用获取我们的Mapper了
从我们之前添加的mapper的那个map中,获取到这个mapper,最后利用jdk的动态代理,返会一个代理对象
就这样这个这个代理对象就被弄出来了,底层就用了jdk的动态代理来实现的,so easy吧
解决了这个疑惑,我们来看下MappedStatement的构建吧
我们在addMapper的时候
我们会执行parser.parse();
我们这上面几天SqlSessionFactory和SqlSession的构建,我们应该已经很熟悉了,今天我们就重点看下
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);是怎样生成的
从configuration对象中把mapper获取到
我们之前看过,这个是一个代理对象,执行invoke方法,看下execute方法