mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]

第一节中,分析了Mybatis的ORM框架的初始化,这篇来分析SQL执行过程中,对象->SQL是如何转换的

  其中包含两种映射思想

  ①DAO接口->Mapper实例

  ②执行DAO的方法时,参数->SQL的转换

  • DAO接口如何转变成具体可执行SQL的Mapper

   我们在使用mybatis的时候,Mapper会设置命名空间。

 Java对象的DAO接口声明如下:

MybatistestMapper {

  从包结构以及命名分析,Dao接口与Mapper有关系(XML 以及Mapper对象)

  在不使用Spring的时候,mybatis通过sqlSession.getMapper(MybatistestMapper.class) 来获得DAO-Mapper代理代理类。

  查看SqlSession的默认实现类DefaultSqlSession.getMapper(),通过configuration得到Mapper

T getMapper(Class configuration.getMapper(type,

  查看Configuration.getMapper

T getMapper(Class

  继续查看mapperRegistry.getMapper。可以得到以下信息

  ①创建Mapper的工厂被缓存在knownMappers

   如果工厂不存在,则报错。查看代码,工厂是在XMLMapperBuilder解析Mapper时候添加进去的。

   根据Mapper.xml中的namespace,缓存Factory。有个好处。对获取的DaoMapper需要在配置文件中配置过。限定了使用范围。也避免后期执行时候出错。

   代码可自行查找源码

  ②当缓存中不存在时,则创建动态代理MapperProxyFactory.newInstance

T getMapper(Class MapperProxyFactory mapperProxyFactory = (MapperProxyFactory (mapperProxyFactory == BindingException("Type " + type + " is not known to the MapperRegistry." BindingException("Error getting mapper instance. Cause: " +

 mapperProxyFactory.newInstance

@SuppressWarnings("unchecked" T newInstance(MapperProxy (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(),<span style="color: #0000ff">public<span style="color: #000000"> T newInstance(SqlSession sqlSession) {  //代理类中实际执行操作的代码
<span style="color: #0000ff">final
MapperProxy mapperProxy = <span style="color: #0000ff">new
MapperProxy<span style="color: #000000">(sqlSession,mapperInterface,methodCache);
<span style="color: #0000ff">return<span style="color: #000000"> newInstance(mapperProxy);
}

  通过以上步骤,我们找到了Dao接口的实现(Mapper 实例接口)

  •  当调用一个DAO接口中的方法时,如何找到SQL以及转化为SQL的?.

  通过上面的代码,可以得知实际执行SQL的是mapperProxy 代理类

  看下mapperProxy 的invoke方法

Object invoke(Object proxy,Method method,Object[] args) (Object. method.invoke( MapperMethod mapperMethod =

 查看MapperMethod的execute方法

====

  到此为止,我们只是找到了要执行的SQL。由SqlSession来执行。

  

  

  

     

相关文章

1.pom.xml引入依赖 &lt;dependency&gt; &lt;gro...
&lt;?xml version=&quot;1.0&quot; encoding=&a...
准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREA...
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、...
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串...
resultMap作用是处理数据表中字段与java实体类中属性的映射关...