Mybatis中Mapper接口如何和xml中的sql绑定&&工厂模式和动态代理在Mybatis中的应用

1. 在使用Mybatis时我们通常要写一个接口,然后XML里写对应的sql语句,那我们在调用接口的时候是如何跟XML中的语句做绑定的呢 下面我们分析下。

Mybatis中Mapper接口如何和xml中的sql绑定&&工厂模式和动态代理在Mybatis中的应用_第1张图片

 

Mapper接口和XMLSQL绑定是在binding包中实现的。通过类名Proxy我们可以想到他是通过动态代理来实现。上图中SqlSession的getMapper方法最终调用的是MapperRegistry中的getMapper方法

下面对该包的类依次分析下

Mybatis中Mapper接口如何和xml中的sql绑定&&工厂模式和动态代理在Mybatis中的应用_第2张图片

2.MapperRegistry通过MapperProxyFactory代理工厂来生产Mapper代理,它的knownMappers属性存的就是我们项目里写的所有Mapper接口,key就是Mapper接口的Class对象,Vaule是接口对象的代理工厂。

Mybatis中Mapper接口如何和xml中的sql绑定&&工厂模式和动态代理在Mybatis中的应用_第3张图片

3.MapperProxyFactory类 顾名思义他是Mapper代理的工厂,用来生产Mapper接口的代理。它有两个属性

  (1)mapperInterface 指的就是我们写的Mapper接口, 例如我有个 UserMapper接口,mapperInterface 就是 UserMapper.class

    (2)  methodCache 是Mapper接口中的方法缓存, 例如我的UserMapper中有一个 selectUserById ,methodCache存的KEY就是selectUserById这个方法 value就是MapperMethod包含方法详细信息。

最终通过newInstance方法生成我们的Mapper代理。

Mybatis中Mapper接口如何和xml中的sql绑定&&工厂模式和动态代理在Mybatis中的应用_第4张图片

 

4.然后看下MapperMethod类,他是用来记录Mapper中方法的详细信息,比如方法操作类型是 SELECT INSERT 或者 DELETE..,返回值的类型是啥,返回值是不是集合,map等 ,

那么mybatis是咋知道你的接口是查询,删除还是修改呢。如下它有俩属性 我们重点看下SqlCommand的构造器

Mybatis中Mapper接口如何和xml中的sql绑定&&工厂模式和动态代理在Mybatis中的应用_第5张图片

(1)SqlCommand内部类,重点来了!resolveMappedStatement方法返回的MappedStatement对象包含的就是我们XML中的SQL语句信息,它是用methodName查的,这也就是为什么我们接口方法要和XML