加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 18:06:28 所属栏目:大数据 来源:网络整理
导读:第一节中,分析了Mybatis的ORM框架的初始化,这篇来分析SQL执行过程中,对象->SQL是如何转换的 其中包含两种映射思想 ①DAO接口->Mapper实例 ②执行DAO的方法时,参数->SQL的转换 DAO接口如何转变成具体可执行SQL的Mapper 我们在使用mybatis的时候,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来执行。

  

  

  

     

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读