Mybatis   发布时间:2019-10-08  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

  其中包含两种映射思想

  ①DAO接口->Mapper实例

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

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

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

s.example.mapper.MybatistestMapper"

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

s.example.mapper; l.List; s.example.model.Mybatistest; MybatistestMapper {

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

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

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

T getMapper(ClassE) { 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 = (MapperProxyFactorys.get(typE); (mapperProxyFactory == { BindingException("Type " + type + " is not known to the MapperRegistry."); } { ); } E) { BindingException("Error getTing mapper instance. Cause: " +E); } }

 mapperProxyFactory.newInstance

@SuppressWarnings("unchecked" T newInstance(MapperProxy{ (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(),{ mapperInterface },mapperProxy); }

<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(); } { ); } } { l.unwrapThrowable(t); } MapperMethod mapperMethod =);  //通过MapperMethod执行 ); }

 查看MapperMethod的execute方法

ject execute(SqlSession sqlSession,Object[] args) { Object result; { { Object param =); result =); updatE: { Object param =);     //实际找到SqlSession的update方法。command.getName()是Mapper的Id result =update(command.getName(),param));

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

  @H_540_197@@H_540_197@title="mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]" alt="mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]" src="https://cn.js-code.com/res/2019/02-07/10/c1ddabd097f5dba8eaf7468ce2ad1147.png" >

  

  

     

大佬总结

以上是大佬教程为你收集整理的mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]全部内容,希望文章能够帮你解决mybatis关于ORM的使用以及设计(二)[DaoInterface 转换 Mapper代理对象]所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: