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

答了Mybatis這個問題后,面試官叫我回去等通知……

開發 前端
雖然我不知道具體是怎么實現的,但我覺得肯定是……(此處略去若干的漫天猜想),但是也不對啊,難道是……(再次略去若干似懂非懂)。

 [[357960]]

背景

前段時間在我的技術群里,大家討論起了為什么UserMapper.java是個接口,沒有具體實現類,而我們可以直接調用其方法?

關于這個問題,我之前面試過一些人,很多人是這么回答的:

1.我領導叫我們使用Mybatis,大家都這么用就這么用了(沒想過,反正就這么用)。

2.雖然我不知道具體是怎么實現的,但我覺得肯定是……(此處略去若干的漫天猜想),但是也不對啊,難道是……(再次略去若干似懂非懂)。

3.使用動態代理實現的(然后就沒有下文了)。

對于上面的三種回答,前面兩種我們就沒必要往下聊了。

但是第三種回答,就有必要往下問:那你說說動態代理有哪些實現方式?Mybatis使用的是哪一種?

如果這個問題你還能回答上來,那么還會繼續問:UserMapper.java中大方法能不能重載?

如果你能回答上面的問題,本文就沒必要往下看了,已經不適合你了。

問題分析

先來看一張圖,這圖里的代碼就是我們前面寫的demo:

為什么一個接口就能和一個xml文件給綁定的呢?這就是今天我們要聊的話題。

可能很多小伙伴不熟悉ibatis,2010年之前,還沒有Mybatis,之后ibatis便成了現在的Mybatis,如果有興趣的朋友,可以看到Mybatis中的包目錄。

這個包目錄中就還是ibatis,并且ibatis的作者現在就在騰訊上班,開發英雄聯盟LOL。

如果有騰訊的小伙伴可以打聽打聽哈,大佬就在身邊。言歸正傳。

Mapper層在Mybatis中現在是接口形式就搞定了,而在ibatis時代還是必須要有實現類的,我記得2012年的時候,使用的就是ibatis,Dao(Mapper)必須要有實現類。

下面我們就來看看Mybatis中是怎么做的。

使用案例

繼續使用我們上一節中的代碼。

controller

service實現類中

打一個斷點,然后使用debug模式啟動項目。并訪問:

http://localhost:9002/test

  1. userMapper=org.apache.ibatis.binding.MapperProxy@6da21078 

發現Mybatis給UserMapper.java生成了一個代理對象,并且從名字上可以看出是JDK動態代理。

關于動態代理請,這里我推薦我之前寫過的一篇文章:

https://gitbook.cn/m/mazi/activity/5d44e35e4fbf44126135c292?sut=c93c00a03b4f11eba07ad99b4dfbdab0&utm_source=chatweixinshare

其實,又差不多回到了ibatis時代,只是Mybatis中是通過動態代理的方式生成的代理類不是我們開發的,而是通過JDK動態代理生成的代理類。

下面我們也使用JDK動態代理來模擬一把。

  1. public class MapperProxy implements InvocationHandler { 
  2.     @SuppressWarnings("unchecked"
  3.     public <T> T newInstance(Class<T> clz) { 
  4.         return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class[] { clz }, this); 
  5.     } 
  6.  
  7.     @Override 
  8.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  9.         if (Object.class.equals(method.getDeclaringClass())) { 
  10.             try { 
  11.                 // 諸如hashCode()、toString()、equals()等方法,將target指向當前對象this 
  12.                 return method.invoke(this, args); 
  13.             } catch (Throwable t) { 
  14.             } 
  15.         } 
  16.         // 投鞭斷流 
  17.         return new User((Integer) args[0], "田維常", 22); 
  18.     } 

再寫一個測試類

  1. import com.tian.mybatis.entity.User
  2. import com.tian.mybatis.mapper.UserMapper; 
  3.  
  4. public class TestProxy { 
  5.     public static void main(String[] args) { 
  6.         MapperProxy proxy = new MapperProxy(); 
  7.  
  8.         UserMapper mapper = proxy.newInstance(UserMapper.class); 
  9.         User user = mapper.selectById(999); 
  10.  
  11.         System.out.println(user); 
  12.  
  13.         System.out.println(mapper.toString()); 
  14.     } 

輸出

  1. User{id=999, userName='田維常', age=22, gender=null
  2. com.tian.mybatis.proxy.MapperProxy@39a054a5 

這便是Mybatis自動映射器Mapper的底層實現原理。

但是在Mybatis中,遠遠不是這么簡單的,但是本質就是這樣的。

下面我們就來大致分析一下Mybatis中的這個流程。

接口Mapper內的方法能重載嗎?

類似下面:

public User getUserById(Integer id);

public User getUserById(Integer id, String name);

答案:不能

因為Mybatis中是使用package+Mapper+method全限名作為key,去xml內尋找唯一sql來執行的。

類似:key=com.tian.mybatis.UserMapper.getUserById,那么,重載方法時將導致矛盾。

對于Mapper接口,Mybatis禁止方法重載(overLoad) 。

在MapperMethod類的靜態內部類中SqlCommand中有個resolveMappedStatement方法。

在Configuration中有個屬性,就是項目啟動的時候,會把Mapper.xml中信息解析到這個屬性里,以我們指定的namespace+method作為key放到Map里面,后面我們調用Mapper接口動態類的某個方法時候再去map獲取。

  1. protected final Map<String, MappedStatement> mappedStatements  

就是使用類的全路徑名.方法作為key存放到Map中的。

總結

常用動態代理方式:JDK動態代理和CGlib動態代理。

Mybatis是采用JDK動態代理+反射+xml來解決接口綁定的,為我們創建可以調用的代理對象。

我們的Mapper中的方法是絕對不能重載的。

前端小智  本文轉載自微信公眾號「Java后端技術全棧」,可以通過以下二維碼關注。轉載本文請聯系Java后端技術全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2022-12-06 09:03:31

MySQL索引

2025-02-13 00:00:00

TCP網絡通信

2021-02-06 09:21:17

MySQL索引面試

2020-06-17 21:22:56

Serverless面試官架構

2022-11-16 17:10:25

MySQL數據事務

2024-08-05 01:26:54

2024-02-26 12:38:21

MySQLInnoDB跨度

2020-12-02 06:12:27

TCPIP面試

2023-09-01 15:27:31

2024-09-03 07:58:46

2020-12-21 06:07:35

Mybatis設計模式

2021-05-28 07:12:58

Mybatis面試官Java

2020-04-16 08:22:11

HTTPS加解密協議

2023-09-21 15:20:49

算法開發

2020-12-14 08:07:06

Mybatis源碼java

2023-09-12 14:56:13

MyBatis緩存機制

2020-09-17 17:53:12

面試ArrayList數組

2024-04-19 08:23:06

2010-08-23 15:06:52

發問

2021-12-20 10:30:33

forforEach前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷激情在线 | 日韩欧美成人一区二区三区 | 日韩精品a在线观看图片 | 亚洲精品资源 | 国产99久久精品 | a级在线免费观看 | 成人午夜视频在线观看 | 国产97在线视频 | 精品国产欧美一区二区 | 中文在线a在线 | 欧美成人精品一区二区三区 | wwwxxx日本在线观看 | 精品亚洲一区二区 | 久久777 | 精品视频一区二区 | 成人性视频免费网站 | 中文字幕免费 | 二区在线视频 | 亚洲精品久久久久久久久久久久久 | 精品国产一区二区三区久久久蜜月 | 九九99九九精彩46 | 日本免费一区二区三区视频 | 国产精品视频综合 | 中文字幕一区二区三区日韩精品 | 欧美在线视频网站 | 成人在线观看网址 | 日本超碰 | 国产亚洲精品91 | 中文字幕日韩欧美一区二区三区 | 午夜影院在线播放 | www.一区二区三区 | 国产精品久久久久久久久免费桃花 | 久久久亚洲 | 91大神在线资源观看无广告 | 欧美最猛性xxxxx亚洲精品 | 在线观看中文字幕 | 色婷婷综合久久久中字幕精品久久 | 超碰人人艹 | 看羞羞视频免费 | 久久99精品久久久久久 | 久久99精品国产 |