精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

美團(tuán)面試:為什么就能直接調(diào)用userMapper接口的方法?

開(kāi)發(fā) 前端
老規(guī)矩,先上案例代碼,這樣大家可以更加熟悉是如何使用的,看過(guò)Mybatis系列的小伙伴,對(duì)這段代碼差不多都可以背下來(lái)了。

[[361093]]

老規(guī)矩,先上案例代碼,這樣大家可以更加熟悉是如何使用的,看過(guò)Mybatis系列的小伙伴,對(duì)這段代碼差不多都可以背下來(lái)了。

哈哈~,有點(diǎn)夸張嗎?不夸張的,就這行代碼。

  1. public class MybatisApplication { 
  2.         public static final String URL = "jdbc:mysql://localhost:3306/mblog"
  3.         public static final String USER = "root"
  4.         public static final String PASSWORD = "123456"
  5.      
  6.         public static void main(String[] args) { 
  7.             String resource = "mybatis-config.xml"
  8.             InputStream inputStream = null
  9.             SqlSession sqlSession = null
  10.             try { 
  11.                 inputStream = Resources.getResourceAsStream(resource); 
  12.                 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
  13.                 sqlSession = sqlSessionFactory.openSession(); 
  14.                 //今天主要這行代碼 
  15.                 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
  16.                 System.out.println(userMapper.selectById(1)); 
  17.      
  18.             } catch (Exception e) { 
  19.                 e.printStackTrace(); 
  20.             } finally { 
  21.                 try { 
  22.                     inputStream.close(); 
  23.                 } catch (IOException e) { 
  24.                     e.printStackTrace(); 
  25.                 } 
  26.                 sqlSession.close(); 
  27.             } 
  28.         } 

看源碼有什么用?

通過(guò)源碼的學(xué)習(xí),我們可以收獲Mybatis的核心思想和框架設(shè)計(jì),另外還可以收獲設(shè)計(jì)模式的應(yīng)用。

前兩篇文章我們已經(jīng)Mybatis配置文件解析到獲取SqlSession,下面我們來(lái)分析從SqlSession到userMapper:

  1. UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 

前面那篇文章已經(jīng)知道了這里的sqlSession使用的是默認(rèn)實(shí)現(xiàn)類(lèi)DefaultSqlSession。所以我們直接進(jìn)入DefaultSqlSession的getMapper方法。

  1. //DefaultSqlSession中   
  2. private final Configuration configuration; 
  3. //type=UserMapper.class 
  4. @Override 
  5. public <T> T getMapper(Class<T> type) { 
  6.   return configuration.getMapper(type, this); 

這里有三個(gè)問(wèn)題:

問(wèn)題1:getMapper返回的是個(gè)什么對(duì)象?

上面可以看出,getMapper方法調(diào)用的是Configuration中的getMapper方法。然后我們進(jìn)入Configuration中

  1. //Configuration中   
  2. protected final MapperRegistry mapperRegistry = new MapperRegistry(this); 
  3. ////type=UserMapper.class 
  4. public <T> T getMapper(Class<T> type, SqlSession sqlSession) { 
  5.     return mapperRegistry.getMapper(type, sqlSession); 

這里也沒(méi)做什么,繼續(xù)調(diào)用MapperRegistry中的getMapper:

  1. //MapperRegistry中 
  2. public class MapperRegistry { 
  3.   //主要是存放配置信息 
  4.   private final Configuration config; 
  5.   //MapperProxyFactory 的映射 
  6.   private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<>(); 
  7.  
  8.   //獲得 Mapper Proxy 對(duì)象 
  9.   //type=UserMapper.class,session為當(dāng)前會(huì)話 
  10.   public <T> T getMapper(Class<T> type, SqlSession sqlSession) { 
  11.     //這里是get,那就有add或者put 
  12.     final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); 
  13.     if (mapperProxyFactory == null) { 
  14.       throw new BindingException("Type " + type + " is not known to the MapperRegistry."); 
  15.     } 
  16.    try { 
  17.       //創(chuàng)建實(shí)例 
  18.       return mapperProxyFactory.newInstance(sqlSession); 
  19.     } catch (Exception e) { 
  20.       throw new BindingException("Error getting mapper instance. Cause: " + e, e); 
  21.     } 
  22.   } 
  23.    
  24.   //解析配置文件的時(shí)候就會(huì)調(diào)用這個(gè)方法, 
  25.   //type=UserMapper.class 
  26.   public <T> void addMapper(Class<T> type) { 
  27.     // 判斷 type 必須是接口,也就是說(shuō) Mapper 接口。 
  28.     if (type.isInterface()) { 
  29.         //已經(jīng)添加過(guò),則拋出 BindingException 異常 
  30.         if (hasMapper(type)) { 
  31.             throw new BindingException("Type " + type + " is already known to the MapperRegistry."); 
  32.         } 
  33.         boolean loadCompleted = false
  34.         try { 
  35.             //添加到 knownMappers 中 
  36.             knownMappers.put(type, new MapperProxyFactory<>(type)); 
  37.             //創(chuàng)建 MapperAnnotationBuilder 對(duì)象,解析 Mapper 的注解配置 
  38.             MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type); 
  39.             parser.parse(); 
  40.             //標(biāo)記加載完成 
  41.             loadCompleted = true
  42.         } finally { 
  43.             //若加載未完成,從 knownMappers 中移除 
  44.             if (!loadCompleted) { 
  45.                 knownMappers.remove(type); 
  46.             } 
  47.         } 
  48.     } 

MapperProxyFactory對(duì)象里保存了mapper接口的class對(duì)象,就是一個(gè)普通的類(lèi),沒(méi)有什么邏輯。

在MapperProxyFactory類(lèi)中使用了兩種設(shè)計(jì)模式:

  1. 單例模式methodCache(注冊(cè)式單例模式)。
  2. 工廠模式getMapper()。

繼續(xù)看MapperProxyFactory中的newInstance方法。

  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.      public T newInstance(SqlSession sqlSession) { 
  9.       //創(chuàng)建MapperProxy對(duì)象 
  10.       final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface, methodCache); 
  11.       return newInstance(mapperProxy); 
  12.     } 
  13.     //最終以JDK動(dòng)態(tài)代理創(chuàng)建對(duì)象并返回 
  14.      protected T newInstance(MapperProxy<T> mapperProxy) { 
  15.         return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy); 
  16.     } 
  17.     } 

從代碼中可以看出,依然是穩(wěn)穩(wěn)的基于 JDK Proxy 實(shí)現(xiàn)的,而 InvocationHandler 參數(shù)是 MapperProxy 對(duì)象。

  1. //UserMapper 的類(lèi)加載器 
  2. //接口是UserMapper 
  3. //h是mapperProxy對(duì)象 
  4. public static Object newProxyInstance(ClassLoader loader, 
  5.                                           Class<?>[] interfaces, 
  6.                                        InvocationHandler h){ 

問(wèn)題2:為什么就可以調(diào)用他的方法?

上面調(diào)用newInstance方法時(shí)候創(chuàng)建了MapperProxy對(duì)象,并且是當(dāng)做newProxyInstance的第三個(gè)參數(shù),所以MapperProxy類(lèi)肯定實(shí)現(xiàn)了InvocationHandler。

進(jìn)入MapperProxy類(lèi)中:

  1. //果然實(shí)現(xiàn)了InvocationHandler接口 
  2.   public class MapperProxy<T> implements InvocationHandler, Serializable { 
  3.    
  4.     private static final long serialVersionUID = -6424540398559729838L; 
  5.     private final SqlSession sqlSession; 
  6.     private final Class<T> mapperInterface; 
  7.     private final Map<Method, MapperMethod> methodCache; 
  8.    
  9.     public MapperProxy(SqlSession sqlSession, Class<T> mapperInterface, Map<Method, MapperMethod> methodCache) { 
  10.       this.sqlSession = sqlSession; 
  11.       this.mapperInterface = mapperInterface; 
  12.       this.methodCache = methodCache; 
  13.     } 
  14.     //調(diào)用userMapper.selectById()實(shí)質(zhì)上是調(diào)用這個(gè)invoke方法 
  15.     @Override 
  16.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  17.       try { 
  18.         //如果是Object的方法toString()、hashCode()等方法   
  19.         if (Object.class.equals(method.getDeclaringClass())) { 
  20.           return method.invoke(this, args); 
  21.         } else if (method.isDefault()) { 
  22.           //JDK8以后的接口默認(rèn)實(shí)現(xiàn)方法   
  23.           return invokeDefaultMethod(proxy, method, args); 
  24.         } 
  25.       } catch (Throwable t) { 
  26.         throw ExceptionUtil.unwrapThrowable(t); 
  27.       } 
  28.       //創(chuàng)建MapperMethod對(duì)象 
  29.       final MapperMethod mapperMethod = cachedMapperMethod(method); 
  30.       //下一篇再聊 
  31.       return mapperMethod.execute(sqlSession, args); 
  32.     } 
  33.   } 

也就是說(shuō),getMapper方法返回的是一個(gè)JDK動(dòng)態(tài)代理對(duì)象(類(lèi)型是$Proxy+數(shù)字)。這個(gè)代理對(duì)象會(huì)繼承Proxy類(lèi),實(shí)現(xiàn)被代理的接口UserMpper,里面持有了一個(gè)MapperProxy類(lèi)型的觸發(fā)管理類(lèi)。

當(dāng)我們調(diào)用UserMpper的方法時(shí)候,實(shí)質(zhì)上調(diào)用的是MapperProxy的invoke方法。

  1. userMapper=$Proxy6@2355。 

為什么要在MapperRegistry中保存一個(gè)工廠類(lèi)?

原來(lái)他是用來(lái)創(chuàng)建并返回代理類(lèi)的。這里是代理模式的一個(gè)非常經(jīng)典的應(yīng)用。

MapperProxy如何實(shí)現(xiàn)對(duì)接口的代理?

JDK動(dòng)態(tài)代理

我們知道,JDK動(dòng)態(tài)代理有三個(gè)核心角色:

  • 被代理類(lèi)(即就是實(shí)現(xiàn)類(lèi))
  • 接口
  • 實(shí)現(xiàn)了InvocationHanndler的觸發(fā)管理類(lèi),用來(lái)生成代理對(duì)象。

被代理類(lèi)必須實(shí)現(xiàn)接口,因?yàn)橐ㄟ^(guò)接口獲取方法,而且代理類(lèi)也要實(shí)現(xiàn)這個(gè)接口。

而Mybatis中并沒(méi)有Mapper接口的實(shí)現(xiàn)類(lèi),怎么被代理呢?它忽略了實(shí)現(xiàn)類(lèi),直接對(duì)Mapper接口進(jìn)行代理。

MyBatis動(dòng)態(tài)代理:

在Mybatis中,JDK動(dòng)態(tài)代理為什么不需要實(shí)現(xiàn)類(lèi)呢?

這里我們的目的其實(shí)就是根據(jù)一個(gè)可以執(zhí)行的方法,直接找到Mapper.xml中statement ID ,方便調(diào)用。

最后返回的userMapper就是MapperProxyFactory的創(chuàng)建的代理對(duì)象,然后這個(gè)對(duì)象中包含了MapperProxy對(duì)象,

問(wèn)題3:到底是怎么根據(jù)Mapper.java找到Mapper.xml的?

最后我們調(diào)用userMapper.selectUserById(),本質(zhì)上調(diào)用的是MapperProxy的invoke()方法。

請(qǐng)看下面這張圖:

如果根據(jù)(接口+方法名找到Statement ID ),這個(gè)邏輯在InvocationHandler子類(lèi)(MapperProxy類(lèi))中就可以完成了,其實(shí)也就沒(méi)有必要在用實(shí)現(xiàn)類(lèi)了。

總結(jié)

本文中主要是講getMapper方法,該方法實(shí)質(zhì)上是獲取一個(gè)JDK動(dòng)態(tài)代理對(duì)象(類(lèi)型是Proxy+數(shù)字),這個(gè)代理類(lèi)會(huì)繼承MapperProxy類(lèi),實(shí)現(xiàn)被代理的接口UserMapper,并且里面持有一個(gè)MapperProxy類(lèi)型的觸發(fā)管理類(lèi)。這里我們就拿到代理類(lèi)了,后面我們就可以使用這個(gè)代理對(duì)象進(jìn)行方法調(diào)用。

問(wèn)題涉及到的設(shè)計(jì)模式:

  1. 代理模式。
  2. 工廠模式。
  3. 單例模式。

整個(gè)流程圖:

本文轉(zhuǎn)載自微信公眾號(hào)「Java后端技術(shù)全?!?,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java后端技術(shù)全棧公眾號(hào)。

 

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

2018-04-23 09:50:54

2020-03-23 12:58:34

美團(tuán)公有云互聯(lián)網(wǎng)

2023-03-28 21:33:53

面試隔離MVCC

2024-06-07 08:10:14

Netty操作系統(tǒng)零拷貝

2025-06-05 03:10:00

mmapmalloc共享內(nèi)存

2024-05-16 17:58:30

線程任務(wù)線程通訊線程池

2023-05-22 08:17:04

2023-12-20 07:36:58

GoLinux語(yǔ)言

2022-02-15 07:03:04

start 源碼run線程

2022-06-15 09:02:32

JVM線程openJDK

2023-05-09 10:05:24

HashMapNull

2013-08-20 13:11:58

技術(shù)美團(tuán)

2023-11-30 08:16:19

SpringjarTomcat

2022-09-05 15:36:47

線程方法Java

2022-03-03 16:45:02

美團(tuán)述職反饋

2023-09-29 11:50:10

接口編程代碼

2017-06-01 10:52:35

互聯(lián)網(wǎng)

2021-08-29 18:36:17

MySQL技術(shù)面試題

2016-11-27 20:43:26

云計(jì)算迭代

2023-01-31 08:44:50

SQL語(yǔ)句查詢
點(diǎn)贊
收藏

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

洋洋成人永久网站入口| 99国产精品99久久久久久粉嫩| 欧美日韩一区国产| 宅男一区二区三区| 四虎免费在线观看| 久久国产欧美日韩精品| 久久久久在线观看| 极品久久久久久久| 超碰在线亚洲| 欧美日韩一区 二区 三区 久久精品 | 亚洲高清资源综合久久精品| 国产农村老头老太视频| 翔田千里一区二区| 欧美第一黄色网| 国产亚洲精品熟女国产成人| 亚洲性视频在线| 欧美写真视频网站| 日韩精品一区在线视频| 九七久久人人| 久久久www成人免费无遮挡大片| 亚洲自拍偷拍色片视频| 日本黄色中文字幕| 国产欧美三级| 欧美第一页在线| 99re6热在线精品视频| 亚洲免费观看高清完整版在线观| 日韩精品在线一区二区| av在线网址导航| 毛片免费看不卡网站| 亚洲大片一区二区三区| 黄黄视频在线观看| 日本三级视频在线观看| 国产欧美一区二区在线观看| 九九久久99| 六月婷婷中文字幕| 国产成人精品免费在线| 91免费高清视频| 亚洲网站在线免费观看| 天堂一区二区在线免费观看| 97超视频免费观看| 久久亚洲AV无码| 国产精品分类| 欧美极品欧美精品欧美视频 | 国产乱人伦真实精品视频| 天堂网中文字幕| 欧美亚洲网站| 热re91久久精品国99热蜜臀| 国产特黄大片aaaa毛片| 在线日本成人| 国内免费久久久久久久久久久| 免费在线视频一区二区| 国产精品二区影院| 午夜精品99久久免费| 国产精品1000| 99视频一区| 5252色成人免费视频| 欧美一区二区激情视频| 国产精品日本| 国产精品99免视看9| 亚洲欧美另类在线视频| 日韩av高清在线观看| 国产xxx69麻豆国语对白| 国产精品一区无码| 日韩福利视频导航| 成人网中文字幕| 亚洲精品人妻无码| 91在线观看地址| 欧美日韩精品久久| 9191在线| 伊人色综合久久天天人手人婷| 日韩国产小视频| f2c人成在线观看免费视频| 天天综合色天天综合| 北条麻妃在线观看| 国模私拍国内精品国内av| 91麻豆精品91久久久久久清纯| 免费人成视频在线播放| 欧美aaaaa级| 亚洲视频在线免费观看| 99热这里只有精品4| 欧美国产高潮xxxx1819| 538国产精品一区二区免费视频| 成人免费毛片视频| 久久99精品一区二区三区| 国产精品入口免费| 国产最新视频在线观看| 亚洲欧美另类综合偷拍| 精品少妇一区二区三区在线| 国产69精品久久久久9999人| 91精品国产乱| mm131美女视频| 久久久五月天| 青青青国产精品一区二区| 中文字幕日韩第一页| 成人综合婷婷国产精品久久蜜臀 | 精品少妇一区二区三区免费观| 久久精品国产亚洲夜色av网站| 欧美激情视频免费观看| 亚洲图片欧美日韩| 播五月开心婷婷综合| 亚洲巨乳在线观看| 日本乱码一区二区三区不卡| 欧美高清视频一二三区| 欧美日韩大陆在线| 女同激情久久av久久| 国产乱论精品| 少妇久久久久久| 国产午夜福利片| 麻豆免费精品视频| 久热国产精品视频一区二区三区| 国产传媒在线播放| 在线观看三级视频欧美| 中文字幕精品视频在线| 亚洲草久电影| 国产精品户外野外| 五月婷婷综合久久| 亚洲精品大片www| 亚洲欧美自拍另类日韩| 四虎884aa成人精品最新| 欧美老妇交乱视频| 在线免费观看一级片| 91视频一区二区| 欧美精品卡一卡二| 国产精品视频一区二区三区| 伊人久久久久久久久久| 亚洲日本韩国在线| 高清视频一区二区| 欧美与动交zoz0z| 免费成人黄色网| 亚洲欧美日韩视频一区| 精品一级少妇久久久久久久| 国产乱淫av一区二区三区| 日韩免费毛片| 欧美极品影院| 亚洲免费电影在线观看| 1级黄色大片儿| 成人黄色777网| 日本人妻伦在线中文字幕| 国产精久久久| 色偷偷av亚洲男人的天堂| 国产精品无码粉嫩小泬| 久久久精品欧美丰满| 免费黄色日本网站| 国产不卡一二三区| 国产精品扒开腿做爽爽爽视频| 色在线免费视频| 欧美性猛交xxxx黑人| 欧美色图亚洲激情| 丝瓜av网站精品一区二区| 欧美日本韩国在线| 韩国女主播一区二区| 在线播放日韩欧美| 亚洲午夜精品久久久| 国产精品人成在线观看免费| 日韩高清第一页| 综合精品久久| 国产精品一码二码三码在线| 美女搞黄视频在线观看| 亚洲免费电影一区| 伊人色综合久久久| 亚洲视频1区2区| 中文字幕无人区二| 亚洲视频www| 亚欧洲精品在线视频免费观看| 欧美高清免费| 欧美日本亚洲视频| 性xxxx视频| 欧美私模裸体表演在线观看| 黑鬼狂亚洲人videos| 成人综合婷婷国产精品久久 | 欧美hdxxxxx| 亚洲精品第一国产综合精品| 久久精品五月天| 国产精品福利电影一区二区三区四区 | 丁香花在线观看完整版电影| 亚洲国内精品视频| 中文av免费观看| 一二三区精品视频| 性少妇bbw张开| 国产一区在线精品| 国产资源在线视频| 国产精品精品国产一区二区| 国产九色91| 日韩毛片一区| 久久久综合av| 五月天婷婷在线视频| 精品美女在线观看| 波多野结衣电影在线播放| 欧美日韩国产精品| 综合激情国产一区| 91精品人妻一区二区三区果冻| 亚洲精品国产第一综合99久久| 亚洲狠狠婷婷综合久久久久图片| 美女爽到高潮91| 欧美高清中文字幕| 成人中文在线| 国产高清自拍一区| 国产69精品久久| 97国产精品免费视频| 日韩毛片久久久| 日韩av在线最新| 国产麻豆免费视频| 在线观看视频91| 日本一级黄色大片| 亚洲品质自拍视频| 日本人亚洲人jjzzjjz| yourporn久久国产精品| 国产美女18xxxx免费视频| 99视频精品| 免费在线黄网站| 无码人妻精品一区二区三区9厂| 亚洲日本青草视频在线怡红院| 日本黄色网址大全| 成人免费视频一区| www.国产福利| 日本不卡一区二区三区高清视频| 黄色一级视频在线播放| 综合五月婷婷| 亚洲欧洲精品一区二区三区波多野1战4 | 最新日韩av在线| 免费a级黄色片| 成人高清免费观看| 国产精品成人免费一区久久羞羞| 麻豆91在线观看| 天天操天天爽天天射| 久久av一区二区三区| 妞干网在线视频观看| 狠狠入ady亚洲精品| 黑人巨大国产9丨视频| 久久裸体网站| 亚洲一区三区电影在线观看| 国产麻豆精品久久| 欧美 日韩 国产在线| 日韩av系列| 精品国产综合区久久久久久| aiai久久| 国产精品免费一区二区三区| 亚洲一区二区三区中文字幕在线观看| 亚洲a∨日韩av高清在线观看| 精品久久毛片| 国产一区二区色| 日韩美女在线| 国产欧美久久久久久| 欧美美女被草| 国产日韩视频在线观看| 亚洲成人高清| 性欧美疯狂xxxxbbbb| 日韩av片在线免费观看| 国产精品美女久久久久aⅴ国产馆| 日本黄色小视频在线观看| 国产欧美日韩综合精品一区二区| 天天干天天舔天天操| 国产精品青草久久| 极品魔鬼身材女神啪啪精品| 亚洲品质自拍视频网站| 久久国产露脸精品国产| 亚洲国产成人av好男人在线观看| 国产午夜福利一区二区| 精品国产老师黑色丝袜高跟鞋| 你懂的国产视频| 日本高清视频一区二区| 一区二区视频在线免费观看| 福利所第一导航| 亚洲尤物影院| www.日韩av.com| 国产一二三区在线观看| 欧美成人黑人xx视频免费观看| 色女人在线视频| 97国产suv精品一区二区62| 亚洲欧洲自拍| 国产精品尤物福利片在线观看| 久久中文字幕视频| 国产三级视频在线| 日韩中文字幕欧美| 呦呦在线视频| 久久男人av资源网站| 一二三四视频在线中文| 国产精品久久久久久久久久久新郎| 素人一区二区三区| 91在线高清免费观看| 成人爽a毛片免费啪啪红桃视频| 精品亚洲欧美日韩| 日韩精品午夜| 国产一区二区三区乱码| 久久久久久穴| 黑人巨大猛交丰满少妇| 久久综合五月天婷婷伊人| 国产馆在线观看| 亚洲图片欧美一区| 国产成人av免费| 精品国免费一区二区三区| 理论在线观看| 欧美国产日本在线| 欧美日韩在线精品一区二区三区激情综合| 5566av亚洲| 欧美限制电影| 国产精品成人久久电影| 麻豆国产一区二区| 欧美大片免费播放器| 亚洲欧美综合网| 国产又黄又爽又色| 日韩欧美的一区| 成人动漫在线免费观看| 久久久视频免费观看| 日韩欧美专区| 欧美系列一区| 亚洲伦理精品| 成人黄色一级大片| 国产午夜精品一区二区| 久久久久久久9999| 欧美精品一二三| 国产专区在线| 91国语精品自产拍在线观看性色 | 青青草免费av| 欧美三级韩国三级日本三斤| 亚洲av成人精品毛片| 欧美另类老女人| 欧美一区=区三区| 日韩欧美激情一区二区| 亚洲自拍另类| 欧美大喷水吹潮合集在线观看| 亚洲欧美日韩系列| 国产又粗又长视频| 在线日韩日本国产亚洲| 欧美xxxxxx| 你懂的视频在线一区二区| 91久久夜色精品国产九色| 久久精品夜夜夜夜久久| 久久偷窥视频| 欧美日本一区二区视频在线观看 | 18视频在线观看网站| 国产美女被下药99| 精品久久久久久久久久久下田 | 亚洲国产成人二区| 激情五月综合色婷婷一区二区| 国产精品xvideos88| 91人人澡人人爽| 亚洲一区中文日韩| 亚洲国产精品suv| 欧美美最猛性xxxxxx| 九九99久久精品在免费线bt| 国产精品波多野结衣| 久久99国产精品免费网站| 久久嫩草捆绑紧缚| 这里只有精品视频在线观看| 欧美96在线| 91九色蝌蚪成人| 悠悠资源网久久精品| 亚洲 欧美 日韩在线| 精品久久久久久久久久久| 四虎影视精品成人| 国产精品久久久久久久av电影| 日韩久久精品| 五月天婷婷在线观看视频| 一区二区三区欧美日| 欧美一级在线免费观看| 午夜精品久久17c| 美女毛片一区二区三区四区最新中文字幕亚洲 | 六月婷婷七月丁香| 欧美天天综合网| 黄色av网站在线播放| http;//www.99re视频| 一区二区日本视频| 国产手机在线观看| 欧美日韩不卡视频| 欧美日韩在线视频免费观看| 国内视频一区二区| 人人爽香蕉精品| 亚洲综合视频网站| 亚洲а∨天堂久久精品9966| 韩日成人影院| 综合视频免费看| caoporen国产精品视频| 免费视频网站在线观看入口| 久久久91精品| 日本在线中文字幕一区| 中文字幕成人免费视频| 亚洲丰满少妇videoshd| freemovies性欧美| 超碰97在线人人| 丝袜美腿一区二区三区| 青青草偷拍视频| 亚洲人成五月天| 国产一区二区| 无码少妇一区二区三区芒果| 国产精品高潮呻吟久久| 五月天婷婷视频| 国产自摸综合网| 国产精品久久久免费| 四虎884aa成人精品| 亚洲精品中文字幕有码专区| 国产精品毛片无码| 无人在线观看的免费高清视频| 亚洲精品久久久蜜桃| 岛国大片在线观看| 国产伦精品一区二区三区视频黑人| 日本vs亚洲vs韩国一区三区二区| 久久久久无码精品国产| 在线视频国产日韩| 欧美尿孔扩张虐视频|