成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊Mybatis系列之Mapper接口

開(kāi)發(fā) 開(kāi)發(fā)工具
了解一個(gè)類(lèi),首先看下成員變量和構(gòu)造方法。這里 config 不用多說(shuō)了吧,主要的是 knownMappers 這個(gè)成員變量。這就是個(gè)map 對(duì)象,只是這個(gè) map 對(duì)象的 value值是個(gè)對(duì)象,所以又要去看下 MapperProxyFactory 這個(gè)對(duì)象。

[[327761]]

 1.上期回顧

首先,我們還是回顧一下上篇文件的類(lèi)容。先看下這個(gè)測(cè)試類(lèi),大家還有印象嗎:

  1. public class MybatisTest { 
  2.     @Test 
  3.     public void testSelect() throws IOException { 
  4.         String resource = "mybatis-config.xml"
  5.         InputStream inputStream = Resources.getResourceAsStream(resource); 
  6.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
  7.         SqlSession session = sqlSessionFactory.openSession(); 
  8.         try { 
  9.             FruitMapper mapper = session.getMapper(FruitMapper.class); 
  10.             Fruit fruit = mapper.findById(1L); 
  11.             System.out.println(fruit); 
  12.         } finally { 
  13.             session.close(); 
  14.         } 
  15.     } 

上篇源碼分析講了 mybatis 一級(jí)緩存的實(shí)現(xiàn)原理。這次,我們來(lái)了解下 mybatis 接口的創(chuàng)建。

2. mapper接口的創(chuàng)建流程

2.1 SqlSession的getMapper()

首先,我們來(lái)看下 FruitMapper mapper = session.getMapper(FruitMapper.class); 這段代碼,意思很簡(jiǎn)單,根據(jù)傳入的class 獲取這個(gè)對(duì)象的實(shí)例。這個(gè)流程有點(diǎn)復(fù)雜,阿粉帶著大家來(lái)跟下源碼:

首先還是ctrl + 左鍵點(diǎn)擊 getMapper 方法,然后會(huì)進(jìn)入到 SqlSession 的 getMapper() 方法。然后之前阿粉也帶著大家了解了, SqlSession 的默認(rèn)實(shí)現(xiàn)類(lèi)是 DefaultSqlSession ,所以我們直接看下 getMapper() 在 DefaultSqlSession 里面的實(shí)現(xiàn):

  1. @Override 
  2. public <T> T getMapper(Class<T> type) { 
  3.     return configuration.getMapper(type, this); 

2.2 Configuration 的getMapper()

這里從 configuration 里面去獲取, configuration 是全局配置對(duì)象,也就是上下文。參數(shù) this 是當(dāng)前的SqlSession 對(duì)象,繼續(xù)跟進(jìn)去看下:

  1. public <T> T getMapper(Class<T> type, SqlSession sqlSession) { 
  2.     return mapperRegistry.getMapper(type, sqlSession); 

2.3 MapperRegistry 的getMapper()

mapperRegistry 對(duì)象是干什么的呢?繼續(xù)點(diǎn)進(jìn)去:

  1. public <T> T getMapper(Class<T> type, SqlSession sqlSession) { 
  2.     final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); 
  3.     if (mapperProxyFactory == null) { 
  4.         throw new BindingException("Type " + type + " is not known to the MapperRegistry."); 
  5.     } 
  6.     try { 
  7.         return mapperProxyFactory.newInstance(sqlSession); 
  8.     } catch (Exception e) { 
  9.         throw new BindingException("Error getting mapper instance. Cause: " + e, e); 
  10.     } 

這里就不好看懂了,需要先看下了解下 MapperRegistry 這個(gè)類(lèi),我們一步一步來(lái),跟著阿粉的思路走:

  1. public class MapperRegistry { 
  2.  
  3.   private final Configuration config; 
  4.   private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<>(); 
  5.  
  6.   public MapperRegistry(Configuration config) { 
  7.     this.config = config; 
  8.   } 
  9.     ... 

了解一個(gè)類(lèi),首先看下成員變量和構(gòu)造方法。這里 config 不用多說(shuō)了吧,主要的是 knownMappers 這個(gè)成員變量。這就是個(gè)map 對(duì)象,只是這個(gè) map 對(duì)象的 value值是個(gè)對(duì)象,所以又要去看下 MapperProxyFactory 這個(gè)對(duì)象,點(diǎn)進(jìn)去:

  1. public class MapperProxyFactory<T> { 
  2.   private final Class<T> mapperInterface; 
  3.   private final Map<Method, MapperMethod> methodCache = new ConcurrentHashMap<>(); 
  4.  
  5.   public MapperProxyFactory(Class<T> mapperInterface) { 
  6.     this.mapperInterface = mapperInterface; 
  7.   } 
  8.     ... 

首先,單獨(dú)看下這個(gè)類(lèi)名 MapperProxyFactory ,取名是很有學(xué)問(wèn)的,好的名字讓你一下就知道是干啥的。所以一看 MapperProxyFactory ,首先就會(huì)聯(lián)想到工廠模式,工廠模式是干啥的?創(chuàng)建對(duì)象的,創(chuàng)建什么對(duì)象呢?創(chuàng)建 MapperProxy 對(duì)象的。MapperProxy 也是有玄機(jī)的,Proxy 的是什么?看到這個(gè)一般都是使用代理模式來(lái)創(chuàng)建代理對(duì)象的。所以就很清楚了, MapperProxyFactory 這個(gè)類(lèi)就是個(gè)工廠,創(chuàng)建的是 mapper 的代理對(duì)象。

然后這個(gè)類(lèi)里面存的是 mapper 的接口和接口里面的方法。

最后,我們回到 MapperRegistry 類(lèi)里面的 getMapper() 方法?,F(xiàn)在是不是要清楚一些,通過(guò) mapper 接口去 map 里面獲取工廠類(lèi) MapperProxyFactory ,然后通過(guò)工廠類(lèi)去創(chuàng)建我們的 mapper 代理對(duì)象。然后在看下 getMapper() 方法里面的 mapperProxyFactory.newInstance(sqlSession); 這段代碼,繼續(xù)點(diǎn)進(jìn)去:

  1. public T newInstance(SqlSession sqlSession) { 
  2.     final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface, methodCache); 
  3.     return newInstance(mapperProxy); 

你看,阿粉猜測(cè)對(duì)不對(duì),MapperProxy 對(duì)象是不是出來(lái)了。然后看 newInstance() 這個(gè)方法:

  1. protected T newInstance(MapperProxy<T> mapperProxy) { 
  2.     return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy); 
  3.   } 

兩個(gè) newInstance() 方法都在MapperProxyFactory 這個(gè)類(lèi)里面,這里就很明顯嘛。典型的 JDK 代理對(duì)象的創(chuàng)建。

好了,到這里我們的 mapper對(duì)象就獲取到了。大家可以想一想,為什么獲取一個(gè) mapper 對(duì)象會(huì)那么復(fù)雜?或者說(shuō) mapper 對(duì)象有什么作用?其實(shí)就是為了通過(guò) mapper 接口的方法獲取到 mapper.xml 里面的 sql,具體怎么獲取的,請(qǐng)?jiān)试S阿粉賣(mài)個(gè)關(guān)子,請(qǐng)聽(tīng)阿粉下回分解。

3.總結(jié)

最后,阿粉以一個(gè)時(shí)序圖來(lái)結(jié)束本篇文章,喜歡的話,記得點(diǎn)個(gè)贊哦。么么噠~

 

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2022-10-20 18:00:00

MyBatis緩存類(lèi)型

2022-06-02 07:11:13

JVMJava

2020-12-08 12:24:55

接口測(cè)試Interface

2021-01-14 10:00:57

Restful接口

2021-12-09 12:22:28

MyBatis流程面試

2023-09-21 08:05:49

Mybatis插件開(kāi)發(fā)

2023-07-26 07:13:55

函數(shù)接口Java 8

2021-09-18 09:45:33

前端接口架構(gòu)

2023-11-20 08:01:38

并發(fā)處理數(shù)Tomcat

2022-12-28 08:16:16

metric聚合java

2021-06-07 08:39:58

SpringBootMyBatisMapper

2025-01-16 10:30:49

2024-06-12 08:36:25

2021-07-11 12:12:49

.NETJWTjson

2022-02-08 23:59:12

USB接口串行

2025-01-07 09:07:36

接口屬性路徑

2022-01-26 00:05:00

接口Spring管理器

2022-11-17 07:43:13

2022-07-11 09:00:37

依賴配置文件Mybati

2021-06-08 09:28:12

.Net通知服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜av电影院| 国产一区二区 | 亚洲精品视频在线看 | 一区二区三区 在线 | 91九色网站| 欧美a在线| 亚洲欧美日韩国产 | 性色av一区二区三区 | 色本道| 91色视频在线 | 伊人网综合在线 | 在线一区 | 一区二区三区回区在观看免费视频 | 日韩免费一区二区 | 免费观看一级毛片 | 亚洲精品视 | 在线日韩欧美 | 欧美一级一 | 二区在线观看 | 欧美日韩在线免费观看 | 中文字幕国产一区 | 成人免费网站在线 | 密桃av| 午夜伦4480yy私人影院 | 久久精品日产第一区二区三区 | 一本久久a久久精品亚洲 | 国产精品美女一区二区 | 国内精品久久久久久久影视简单 | 91豆花视频 | 国产精品久久久久久一区二区三区 | 国产极品车模吞精高潮呻吟 | 国产精品免费观看 | 国产一区视频在线 | 久久久免费电影 | 日本高清中文字幕 | 日韩中文欧美 | 欧美 日韩 亚洲91麻豆精品 | 在线亚洲欧美 | 精品在线观看入口 | 日本成人一区二区 | 一级片av|