Mybatis獲取Mapper映射器(4)2018-08-19

?我們接著上一篇Mybatis(3),我們來(lái)看看上面獲取Mapper的過(guò)程:
我們從mybatis主要構(gòu)件的執(zhí)行流程:

mybatis.png

接下來(lái)我們來(lái)看看SqlSession是什么獲取Mapper的:

AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);

接著看看getMapper:

public <T> T getMapper(Class<T> type) {
    //configuration上下文中根據(jù)Class類(lèi)型來(lái)查找
    return configuration.<T>getMapper(type, this);
  }

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    //從mapperRegistry中獲取mapper代理
    return mapperRegistry.getMapper(type, sqlSession);
  }

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    //獲取生產(chǎn)mapper代理的的MapperProxyFactory
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
      throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
      //真正創(chuàng)建代理mapper的的地方
      return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
      throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
  }


  //創(chuàng)建mapper代理
  public T newInstance(SqlSession sqlSession) {
    final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
    return newInstance(mapperProxy);
  }
//創(chuàng)建mapper代理
protected T newInstance(MapperProxy<T> mapperProxy) {
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
  }
這里我們就可以很明白的看出,Mybatis中為什么只有Mapper接口便能夠運(yùn)行SQL?

答:因?yàn)橛成淦鞯腦ML文件的命名空間對(duì)應(yīng)的就是Mapper接口的全路勁,那么根據(jù)全路徑和方法名便能夠綁定起來(lái),通過(guò)代理技術(shù),為接口提供代理類(lèi),使接口跑起來(lái),而后采用命令模式,最后是使用SqlSession接口的方法使的它能夠執(zhí)行查詢。

這里我們可以理解SQL Mapper:是由一個(gè)Java接口和XML文件(注解)構(gòu)成的
最后我們來(lái)看看Mapper映射器內(nèi)部組成:

1、MappedStatement:保存映射器的一個(gè)節(jié)點(diǎn)。包括許多我們配置的SQL,Sql的id、緩存信息、resultMap、parameterType、resultType、languageDriver
2、SqlSource:它提供BoundSql對(duì)象的地方,它是MappedStatement的一個(gè)屬性。主要作用根據(jù)參數(shù)和其他規(guī)則組裝SQL
3、 BoundSql:它是建立SQL和參數(shù)的地方。它有3個(gè)常用的屬性:SQL、parameterObject、parameterMappings

BoundSql:
目的:在插件中往往需要拿到BoundSql:獲取運(yùn)行的SQL和參數(shù)以及參數(shù)規(guī)則,做出適當(dāng)?shù)男薷?,?lái)滿足我們的特殊需要
BoundSql的3個(gè)屬性:parameterMappings、parameterObject和sql
? parameterObject:參數(shù)本身
? sql:就是我們書(shū)寫(xiě)在映射器里面的一條SQL,在插件的情況下,我們可以根據(jù)需要進(jìn)行改寫(xiě)。
? parameterMappings:它是一個(gè)List<ParameterMapping>,ParameterMapping的對(duì)象描述的是參數(shù)。包括:參數(shù)的屬性、名稱、表達(dá)式、javaType、jdbcType、typeHandler等重要信息。通過(guò)它可以實(shí)現(xiàn)參數(shù)和SQL的結(jié)合,以便PreparedStatement能夠通過(guò)它找到parameterObject對(duì)象的屬性并設(shè)置參數(shù),使程序準(zhǔn)確的執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java數(shù)據(jù)持久化之mybatis 一. mybatis簡(jiǎn)介 1.1 原始的JDBC操作: Java 通過(guò) Jav...
    小Q逛逛閱讀 5,452評(píng)論 0 16
  • 1 Mybatis入門(mén) 1.1 單獨(dú)使用jdbc編程問(wèn)題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,420評(píng)論 0 38
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 6,282評(píng)論 0 4
  • 很多時(shí)候我都不喜歡寫(xiě)自己的故事,因?yàn)楫?dāng)剖白自己內(nèi)心的時(shí)候,總是有一種不安全感和逃避,但是每次又覺(jué)得,這個(gè)故事一再沉...
    納蘭小閱讀 357評(píng)論 0 0
  • 鋪地毯
    地_瓜閱讀 105評(píng)論 0 0

友情鏈接更多精彩內(nèi)容