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

探討Mybatis最硬核的API,你知道幾個?

開發 架構
本文中,我們主要先把 Mybatis 的架構/層次鋪開,俯視 Mybatis 架構的設計全貌,再把幾個硬核的 API 詳細消化。

1、Mybatis 架構與核心API

不出意外的話,在后續源碼剖析相關文章中,我們會對 Mybatis 的源碼進行一次大掃蕩,一起挖掘每一處值得大家深入理解/記憶的知識點。而在本文中,我們主要先把 Mybatis 的架構/層次鋪開,俯視 Mybatis 架構的設計全貌,再把幾個硬核的 API 詳細消化。

整體順序脈絡,希望讓你有所期待 ~

[[375611]]

我們先簡單揭開 Mybatis 神秘的源碼包,

瞅瞅 Ta 大致目錄結構 :

Mybatis最硬核的API你知道幾個?

看,Mybatis 的源代碼包整齊劃一排在 org.apache.ibatis 目錄下,基本設計用途我簡單梳理成上面這張圖,方便大家直觀理解,當然只看源碼包目錄結構,難免會顯得枯燥無物,所以我們再看一下,其實 Mybatis 的源碼包功能上可以是這么劃分:

Mybatis最硬核的API你知道幾個?

上圖讓我們對 Mybatis 的架構有了抽象的理解。

然而,實際上具體的職能分工,核心 API 的場景應用,到底會是怎樣一套流程呈現呢?

看下面這幅功能架構設計,或許你能更好的理解。

 Mybatis最硬核的API你知道幾個?

根據 Mybatis 功能架構我們劃分成三層:

  • 接口層:該層提供一系列接口讓用戶直接參與使用,包含信息配置與實際數據操作調用。配置方式包括:基于 XML 配置方式、基于 Java API 配置方式兩種方式,用戶也可以通過接口層 API 對數據庫發起增刪改查等操作的請求, 本層接口會把接收到的調用請求交給數據處理層的構件去處理。
  • 數據處理層:該層是 Mybatis 的核心層,負責數據處理,主要包括SQL 參數映射解析、SQL 語句的實際執行、執行結果集的映射處理等。
  • 框架支撐層:該層屬于 Mybatis 的后勤保障層,包括數據庫連接管理、事務把控管理、配置加載與緩存處理、日志處理、異常處理等,提供基礎支撐能力,保障上層的數據處理。

我們知道,Mybatis 框架讓用戶只需要提供配置信息,并且專注于 SQL 的編寫即可,對于連接管理數據庫/事務,或實際的 SQL 參數映射/語句執行/結果集映射等操作,作為用戶都并不需要操心和參與。

但是,好奇的我們其實想知道,Mybatis 核心部分的數據處理在整體流程中,是如何支撐用戶請求?同時各個構件之間交互,又是怎樣流轉呢?

很巧,我這里有一張圖,介紹了整體流程:

Mybatis最硬核的API你知道幾個?

根據以上框架流程圖進行講解:

  • 創建配置并調用API :這一環節發生在應用程序端,是開發人員在實際應用程序中進行的兩步操作,第一步創建核心配置文件 Configuration.xml 和映射文件 mapper.xml (通過注解方式也可創建以上兩種配置),準備好基礎配置和 SQL 語句之后;第二步就是直接調用 Mybatis 框架中的數據庫操作接口。
  • 加載配置并初始化 :Mybatis 框架會根據應用程序端提供的核心配置文件與 SQL 映射文件的內容,使用資源輔助類 Resources 把配置文件讀取成輸入流,然后通過對應的解析器解析并封裝到 Configuration 對象和 MappedStatement 對象,最終把對象存儲在內存之中。
  • 創建會話并接收請求 :在 Mybatis 框架加載配置并初始化配置對象之后,會話工廠構建器 SqlSessionFactoryBuilder 同時創建會話工廠 SqlSessionFactory,會話工廠會根據應用程序端的請求,創建會話 SqlSession,以便應用程序端進行數據庫交互。
  • 處理請求 :SqlSession 接收到請求之后,實際上并沒有進行處理,而是把請求轉發給執行器 Executor,執行器再分派到語句處理器 StatementHandler ,語句處理器會結合參數處理器 ParameterHandler ,進行數據庫操作(底層封裝了 JDBC Statement 操作)。
  • 返回處理結果 :每個語句處理器 StatementHandler 處理完成數據庫操作之后,會協同 ResultSetHandler 以及類型處理器 TypeHandler ,對底層 JDBC 返回的結果集進行映射封裝,最終返回封裝對象。

針對以上總體框架流程涉及到的這些硬核 API,下面我們逐個展開介紹,但不會詳細剖析源碼與原理,包括構建細節,因為這些我們在后續的源碼剖析章節中都會詳細分析。

2、Configuration – 全局配置對象

對于 Mybatis 的全局配置對象 Configuration,我相信無論是初學者還是資深玩家,都不會陌生。整個 Mybatis 的宇宙,都圍繞著 Configuration 轉。Configuration 對象的結構和 config.xml 配置文件的內容幾乎相同,涵蓋了properties (屬性),settings (設置),typeAliases (類型別名),typeHandlers (類型處理器),objectFactory (對象工廠),mappers (映射器)等等,之前我們有專門的一篇文章詳細進行介紹,感興趣的朋友往上翻到目錄列表,找到 《Mybatis系列全解(四):全網最全!Mybatis配置文件XML全貌詳解》 一文詳細品味一番吧。

Mybatis最硬核的API你知道幾個?

配置對象 Configuration 通過解析器 XMLConfigBuilder 進行解析,把全局配置文件 Config.xml 與 映射器配置文件 Mapper.xml 中的配置信息全部構建成完整的 Configuration 對象,后續我們源碼分析時詳細剖析整個過程。

3、Resources – 資源輔助類

我們知道,像 Configuration 和 Mapper 的配置信息存放在 XML 文件中,Mybatis 框架在構建配置對象時,必須先把 XML 文件信息加載成流,再做后續的解析封裝,而 Resources 作為資源的輔助類,恰恰干的就是這個活,無論是通過加載本地資源或是加載遠程資源,最終都會通過 類加載器 訪問資源文件并輸出文件流。

Mybatis最硬核的API你知道幾個?
  1. //加載核心配置文件 
  2. InputStream resourceAsStream =  
  3.     Resources.getResourceAsStream("Config.xml"); 

 Resources 實實在在提供了一系列方法分分鐘解決你的文件讀取加載問題:

Mybatis最硬核的API你知道幾個?

4、SqlSessionFactoryBuilder – 會話工廠構建器

我們一撞見 xxxBuilder ,就大致能知道它是某類對象的構建器,這里 SqlSessionFactoryBuilder 也是一樣,它是 Mybatis 中的一個會話工廠構建器,在資源輔助類 Resources 讀取到文件流信息之后,它負責解析文件流信息并構建會話工廠 SqlSessionFactory。(解析的配置文件包含:全局配置 Configuration 與映射器 Mapper)

Mybatis最硬核的API你知道幾個?

在程序應用端,我們一般使用 SqlSessionFactoryBuilder 直接構建會話工廠:

  1. // 獲得sqlSession工廠對象 
  2. SqlSessionFactory sqlSessionFactory =  
  3.     new SqlSessionFactoryBuilder().build(resourceAsStream); 

 當然,如果你集成了 Spring 框架的項目,則不需要自己手工去構建會話工廠,直接在 Spring 配置文件中指定即可,例如指定一個 bean 對象,id 是 sqlSessionFactory,而 class 類指定為 org.mybatis.spring.SqlSessionFactoryBean 。

SqlSessionFactoryBuilder 內部通過解析器 XMLConfigBuilder 解析了文件流,同時封裝成為配置對象 Configuration ,再把 Configuration 對象進行傳遞并構建實例。

  1. public SqlSessionFactory build( 
  2.     InputStream inputStream,  
  3.     String environment,  
  4.     Properties properties) { 
  5.     
  6.       
  7.       // 配置解析器解析 
  8.       XMLConfigBuilder parser =  
  9.           new XMLConfigBuilder( 
  10.             inputStream,environment, properties); 
  11.      
  12.       // 最終實例會話工廠 
  13.       return build(parser.parse());  
  14.      

 最終實例會話工廠,其實 Mybatis 默認實現是 new 了一個DefaultSqlSessionFactory 實例。

  1. // 最終實例會話工廠 
  2. public SqlSessionFactory build(Configuration config) { 
  3.     
  4.     return new DefaultSqlSessionFactory(config); 

 會話工廠構建器 SqlSessionFactoryBuilder 應用了構建者模式,主要目的就是為了構建 SqlSessionFactory 對象,以便后續生產 SqlSession 對象,這個構造器基本上算是 Mybatis 框架的入口構建器,它提供了一系列多態方法 build(),支持用戶使用 XML 配置文件或 Java API (Properties)來構建會話工廠 SqlSessionFactory 實例。

SqlSessionFactoryBuilder 的一生只為成就 SqlSessionFactory,當 SqlSessionFactory 一經實例,SqlSessionFactoryBuilder 使命完成,便可消亡,便可被丟棄。

Mybatis最硬核的API你知道幾個?

因此 SqlSessionFactoryBuilder 實例的最佳作用域是 方法作用域 (也就是局部方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但最好不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

SqlSessionFactoryBuilder 中靈活構建會話工廠的一系列接口:

Mybatis最硬核的API你知道幾個?

5、SqlSessionFactory – 會話工廠

會話工廠 SqlSessionFactory 是一個接口,作用是生產數據庫會話對象 SqlSession ,有兩個實現類:

  • **DefaultSqlSessionFactory **(默認實現)
  • **SqlSessionManager **(僅多實現了一個 Sqlsession 接口,已棄用)

在介紹會話工廠構建器 SqlSessionFactoryBuilder 的時候,我們了解到構建器默認創建了 DefaultSqlSessionFactory 實例,并且會話工廠本身會綁定一個重要的屬性 Configuration 對象,在生產會話時,最終也會把 Configuration 配置對象傳遞并設置到會話 SqlSession 上。

Mybatis最硬核的API你知道幾個?

會話工廠可以簡單創建 SqlSession 實例:

  1. // 創建 SqlSession 實例 
  2. SqlSession session = sqlSessionFactory.openSession(); 

 會話工廠創建 SqlSession 時,會綁定數據源、事務處理、執行器等等,默認會話工廠實現類 DefaultSqlSessionFactory 在創建會話對象時,最終都會調用 openSessionFromDataSource 方法 ,即是如此實現:

  1. // 每一個 openSession 最終都會調用此處 
  2. private SqlSession openSessionFromDataSource( 
  3.     ExecutorType execType,  
  4.     TransactionIsolationLevel level,  
  5.     boolean autoCommit) { 
  6.     
  7.      
  8.     // 環境配置 
  9.     final Environment environment =  
  10.         configuration.getEnvironment(); 
  11.      
  12.     // 事務工廠 
  13.     final TransactionFactory transactionFactory =  
  14.         getTransactionFactoryFromEnvironment(environment); 
  15.      
  16.     // 事務 
  17.     Transaction tx = 
  18.         transactionFactory.newTransaction( 
  19.         environment.getDataSource(),  
  20.         level,  
  21.         autoCommit); 
  22.      
  23.     // 執行器 
  24.     final Executor executor =  
  25.         configuration.newExecutor(tx, execType); 
  26.      
  27.     // 最終生成會話 
  28.     return new DefaultSqlSession( 
  29.           configuration, executor, autoCommit); 
  30.      
  31.   } 

 另外,會話工廠其實提供了一系列接口來靈活生產會話 SqlSession,你可以指定:

  • 事務處理 :你希望在 session 作用域中使用/開啟事務作用域(也就是不自動提交事務),還是使用自動提交(auto-commit),sqlSession 默認不提交事務,對于增刪改操作時需要手動提交事務。
  • 數據庫連接 :你希望 MyBatis 幫你從已配置的數據源獲取連接,還是使用自己提供的連接,可以動態創建數據源對象 Connection。
  • 執行器類型 :你希望指定某類執行器來創建/執行/預處理語句,可以有普通執行器(SimpleExecutor),或復用執行器(ReuserExecutor)、還是批量執行器(BatchExecutor)等,下面介紹執行器時會詳細說明。
  • 事務隔離級別支持 :支持 JDBC 的五個隔離級別(NONE、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE),對于事務相關的內容,我們后續 《spring 系列全解》 會詳細講,這里簡單說明一下就是事務隔離級別主要為了解決例如臟讀、不可重復讀、幻讀等問題,使用不同的事務隔離級別勢必會導致不同的數據庫執行效率,因此我們再不同的系統/功能中,對隔離級別有不同的需求。
Mybatis最硬核的API你知道幾個?

SqlSessionFactory一旦被創建就應該在 應用的運行期間 一直存在,沒有任何理由丟棄它或重新創建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重復創建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是 應用作用域 。 最簡單的就是使用單例模式或者靜態單例模式。

請記住,創建 SqlSessionFactory ,一次就好!

每個數據庫對應一個 SqlSessionFactory 實例。SqlSessionFactory 一旦被創建, 它的生命周期應該與應用的生命周期相同 。所以,如果你想連接兩個數據庫,就需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個;而如果是三個數據庫,就需要三個實例,依此類推。

Mybatis最硬核的API你知道幾個?

6、SqlSession – 會話

SqlSession 是一個接口,有兩個實現類:

  • DefaultSqlSession (默認實現)
  • SqlSessionManager (已棄用)

簡單來說,通過會話工廠構建出 SqlSession 實例之后,我們就可以進行增刪改查了,默認實例 DefaultSqlSession 提供了如此多的方法供用戶使用,有超過30個:

Mybatis最硬核的API你知道幾個?

sqlSession 的方法除了 CURD,還提供了事務的控制例如提交/關閉/回滾等、提供了配置對象的獲取例如 getConfiguration()、提供了批量語句的執行更新例如 flushStatements()、提供了緩存清除例如 clearCache() 、提供了映射器的使用 getMapper() 等等。

Mybatis最硬核的API你知道幾個?

對于客戶端應用層面來說,熟悉 sqlSession 的 API 基本就可以任意操作數據庫了,不過我們希望想進一步了解 sqlSession 內部是如何執行 sql 呢?其實 sqlSession 是 Mybatis 中用于和數據庫交互的 頂層類 ,通常將它與本地線程 ThreadLocal 綁定,一個會話使用一個 SqlSession,并且在使用完畢之后進行 關閉 。

之所以稱 SqlSession 為數據交互的 頂層類 ,是它其實沒有完成實質的數據庫操作。根據之前的架構設計流程我們已經清晰的知道,SqlSession 對數據庫的操作都會轉發給具體的執行器 Executor 來完成 ;當然執行器也是甩手掌柜,執行器 Executor 會再分派給語句處理器 StatementHandler ,語句處理器會結合參數處理器 ParameterHandler ,共同完成最終的數據庫執行處理操作(底層還是封裝了 JDBC Statement 操作)。并在每個語句處理器 StatementHandler 處理完成數據庫操作之后, 通過結果結處理器 ResultSetHandler 以及類型處理器 TypeHandler ,對底層 JDBC 返回的結果集進行映射封裝,最終才返回預期的封裝對象。

關注以下圖示 sqlSession 紅色高亮位置,詳細描述了會話的實際執行路徑:

Mybatis最硬核的API你知道幾個?

SqlSession 可以理解為一次數據庫會話,一次會話當中既可以執行一次 sql ,也允許你批量執行多次,但是一旦會話關閉之后想要再執行 sql,那就必須重新創建會話。

Mybatis最硬核的API你知道幾個?

每個線程都應該有它自己的 SqlSession 實例,SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是 請求(request)或方法(method) 作用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。 也絕不能將 SqlSession 實例的引用放在任何類型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以打開一個 SqlSession,返回一個響應后,就關閉它。 這個關閉操作很重要,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-08-01 11:14:07

開源Api軟件

2024-08-21 08:54:35

2025-03-25 10:49:13

2024-03-01 13:48:00

Git配置系統

2021-11-04 11:54:30

Linux內存系統

2024-01-18 00:16:07

2021-10-12 09:20:02

數據庫SQL腳本

2021-02-27 17:13:21

前端代碼邏輯

2023-04-27 08:15:09

2023-10-31 08:23:54

網絡命令Linux

2022-04-13 10:05:48

網關Flowable事件訂閱

2022-06-04 08:29:27

awk命令BEGIN

2021-10-14 06:52:47

算法校驗碼結構

2024-04-15 00:04:00

APP開發

2023-11-26 00:26:00

2023-05-30 14:54:17

Python循環語句工具

2019-06-03 10:14:07

API網關微服務

2020-05-06 14:14:50

Linux依賴軟件

2025-07-11 01:45:00

API監控Spring

2018-04-26 09:03:48

ApacheWeb服務器
點贊
收藏

51CTO技術棧公眾號

麻豆视频在线免费观看| 精品人妻一区二区色欲产成人| 亚洲欧美久久精品| 欧美激情一二三区| 亚洲一区二区三区毛片| 欧美丰满艳妇bbwbbw| 国产精品对白| 欧美伊人久久大香线蕉综合69 | 精品在线99| 欧美日韩午夜在线视频| 九九热只有这里有精品| 国产黄在线观看| 粉嫩aⅴ一区二区三区四区| 国产成人福利视频| 久久久精品91| 日韩在线高清| 欧美精品一区男女天堂| 久久这里只精品| 国产一二在线播放| 亚洲日本中文字幕区| 精品久久久三级| 国产强被迫伦姧在线观看无码| 香蕉精品999视频一区二区| 久久资源免费视频| 国产ts在线播放| 大奶在线精品| 欧美艳星brazzers| 女人喷潮完整视频| 丁香花在线高清完整版视频| 国产精品美女久久久久aⅴ国产馆| 国产富婆一区二区三区| 国产又大又长又粗| 天堂va蜜桃一区二区三区漫画版| 欧美激情网友自拍| 中文字幕av久久爽av| 久久国产亚洲| 亚洲久久久久久久久久| 91超薄肉色丝袜交足高跟凉鞋| 亚洲福利影视| 欧美三级午夜理伦三级中视频| 成年人视频观看| 91美女主播在线视频| 一区二区三区不卡在线观看| 亚洲第一精品区| 91亚洲精选| 日本一区二区三区久久久久久久久不| 久久99精品国产一区二区三区| 亚洲黄色一级大片| 国产成人免费在线观看不卡| 日韩免费观看在线观看| 亚洲欧美综合另类| 在线欧美福利| 午夜精品一区二区三区在线视| 天天干中文字幕| 亚洲女同一区| 欧美精品在线免费播放| 中文字幕影音先锋| 欧美日韩国产高清| 国内外成人免费激情在线视频 | 国内精品亚洲| 久久久免费电影| 亚欧视频在线观看| 国产日韩欧美一区在线| 91成人精品网站| 伊人久久久久久久久久久久| 久久这里有精品15一区二区三区| 日本三级久久久| 在线免费观看av片| 国产乱码精品一区二区三区五月婷| 成人免费淫片aa视频免费| 国产精品一区二区av白丝下载| 国产一区二区导航在线播放| 99久久精品免费看国产一区二区三区| 成人午夜视频一区二区播放| av爱爱亚洲一区| 久久综合一区二区三区| 国产精品二线| 亚洲人午夜精品天堂一二香蕉| 国产在线观看欧美| 欧亚av在线| 色老汉一区二区三区| 蜜臀av免费观看| 欧州一区二区三区| 亚洲黄色在线观看| 色欲狠狠躁天天躁无码中文字幕 | 91福利免费视频| 国产精品一区一区三区| 久久99精品久久久久久三级 | 国产欧美精品区一区二区三区 | 国产精品免费一区二区| 欧美性孕妇孕交| 国产精品高潮呻吟久久| 97视频在线免费| 欧美在线va视频| 日韩一本二本av| 中国美女乱淫免费看视频| 久久看人人摘| 97成人精品视频在线观看| 青青艹在线观看| 成人午夜电影网站| 亚洲欧美日本国产有色| 55av亚洲| 91精品国产一区二区| 亚洲精品在线视频免费观看| 久久综合成人| **欧美日韩vr在线| 国产黄a三级三级看三级| ww久久中文字幕| av久久久久久| 激情欧美一区二区三区黑长吊| 日韩美女在线视频| 九一在线免费观看| 亚洲欧美日本日韩| 操一操视频一区| 天天综合视频在线观看| 欧美日韩在线另类| 亚洲av午夜精品一区二区三区| 精品一区二区三区中文字幕老牛| 欧美激情第99页| 一级做a爱片久久毛片| 99精品久久只有精品| 肉大捧一出免费观看网站在线播放| 亚洲黄色免费av| 精品国产一区二区在线观看| 精品伦精品一区二区三区视频密桃| 在线一区欧美| 国产福利久久精品| 午夜影院免费在线| 在线成人免费视频| wwwww黄色| 久久深夜福利| 蜜桃欧美视频| 天堂在线中文网官网| 精品国产乱码久久久久久图片 | 性囗交免费视频观看| 自产国语精品视频| 成人激情视频免费在线| 最新97超碰在线| 91国产福利在线| 3d动漫精品啪啪一区二区下载| 国产精品v亚洲精品v日韩精品| 成人免费xxxxx在线观看| 黄色国产在线| 91久久精品一区二区| 国产熟妇搡bbbb搡bbbb| 国产精品毛片在线| 久久精品第九区免费观看 | 国产精品jizz在线观看麻豆| 日本一区二区三区在线观看视频| 亚洲超碰精品一区二区| 99精品一区二区三区无码吞精| 亚洲无线视频| 国产精品国色综合久久| 大香伊人久久| 日韩精品在线免费观看视频| 国产一级做a爱片久久毛片a| 91女厕偷拍女厕偷拍高清| 欧美在线一区视频| 美女毛片一区二区三区四区最新中文字幕亚洲| 欧美一级片在线播放| 精华区一区二区三区| 欧美在线观看你懂的| 亚洲色图日韩精品| 国产一区二区91| 日韩精品一区二区在线视频| 成人午夜三级| 97人人模人人爽人人喊中文字| 五月婷婷六月激情| 色妹子一区二区| 日本女人性生活视频| 激情欧美一区二区| 欧美另类videosbestsex日本| 99精品中文字幕在线不卡| 国色天香2019中文字幕在线观看| 四虎精品在永久在线观看 | 欧美诱惑福利视频| www.91在线| 日韩一区二区在线播放| 日韩精品一卡二卡| 中文字幕第一区综合| 激情在线观看视频| 国产一区二区高清| 中文字幕久久一区| 国产三级精品三级在线观看国产| 欧美在线视频一区二区| 免费黄网在线观看| 亚洲精品在线免费观看视频| 日日夜夜操视频| 亚洲丝袜自拍清纯另类| 一起草在线视频| 麻豆精品国产传媒mv男同| www.在线观看av| 精品久久中文| 成人三级在线| 另类一区二区| 97在线免费视频| 久做在线视频免费观看| 亚洲精品第一国产综合精品| 亚洲网站免费观看| 无码av免费一区二区三区试看 | 天天综合网天天综合色| 男人天堂资源网| 91日韩精品一区| 色姑娘综合天天| 奇米一区二区三区| 日本在线xxx| 亚洲国产一成人久久精品| 久热这里只精品99re8久| 国产亚洲观看| 国产精品欧美一区二区| 黑人极品ⅴideos精品欧美棵| 丝袜情趣国产精品| 三级无遮挡在线观看| 日韩女优视频免费观看| 成人黄色免费网| 欧美日韩国产精品一区| 欧美国产日韩综合| 中文字幕在线一区二区三区| 欧美成人午夜精品免费| 不卡一区二区中文字幕| 亚洲 自拍 另类 欧美 丝袜| 日本vs亚洲vs韩国一区三区二区| 欧美日韩成人免费视频| 欧美特黄视频| 天堂av免费看| 欧美第十八页| 亚洲春色在线视频| 精品国产美女| 欧美一区亚洲二区| 欧美精品中文| 久中文字幕一区| 日韩在线黄色| 久久伦理网站| 日韩在线你懂的| 久久久久久久久久久久久久久久av | 亚洲mv在线观看| 久久伊人成人网| 亚洲一区二区高清| www.99re7.com| 亚洲国产精品久久不卡毛片 | 在线播放视频一区| 欧美特级黄色片| 欧美视频一区二区| 在线免费观看av片| 666欧美在线视频| 国产三级视频在线播放| 日韩视频不卡中文| 成人av手机在线| 欧美va日韩va| 欧性猛交ⅹxxx乱大交| 亚洲国产精品久久91精品| 日本人妻熟妇久久久久久| 亚洲国产美女久久久久| 亚洲欧洲成人在线| 亚洲三级 欧美三级| 成年午夜在线| 久久视频在线免费观看| av在线麻豆| 午夜精品久久久99热福利| 韩国成人动漫| 国产精品色视频| 国产精品一区二区精品| 超碰97在线资源| 天天躁日日躁狠狠躁欧美| 欧美一区二区在线视频观看| 日韩精品影视| 蜜桃网站在线观看| 国产日韩欧美一区| 向日葵污视频在线观看| 国产精品一卡二卡| 无码人妻aⅴ一区二区三区 | 精品一区二区三区在线视频| 亚洲制服中文字幕| 成人午夜又粗又硬又大| www.中文字幕av| 亚洲欧洲成人av每日更新| 九九久久免费视频| 色婷婷久久久久swag精品 | 亚洲黄色片网站| 69xxxx欧美| 久久久视频免费观看| 亚洲va中文在线播放免费| 91日韩在线播放| 日韩美女毛片| 久久免费一级片| 久久都是精品| 性猛交╳xxx乱大交| 久久久久久毛片| 2018天天弄| 色婷婷综合五月| www日本高清| 国产亚洲欧洲黄色| 啦啦啦中文在线观看日本| 国产成人av网址| 97色成人综合网站| 亚洲mv在线看| 亚洲麻豆视频| 在线视频一二区| 久久久久久亚洲综合影院红桃| www.超碰在线观看| 欧美在线free| 天堂av一区二区三区| 久久久精品影院| 综合在线影院| 国产女人水真多18毛片18精品| 日韩片欧美片| 黑人糟蹋人妻hd中文字幕| 国产九九视频一区二区三区| 69视频在线观看免费| 亚洲成人av一区二区三区| 一区二区不卡视频在线观看| 亚洲精品在线不卡| √天堂8资源中文在线| 亚洲一区二区在线播放| 欧美特黄一级大片| 日本免费一级视频| a美女胸又www黄视频久久| 小泽玛利亚一区| 欧美亚洲综合网| 青青九九免费视频在线| 欧美黄色免费网站| 国产精品一区二区精品| 亚洲午夜久久久影院伊人| 久久久久久网| yy6080午夜| 亚洲午夜在线观看视频在线| 一区二区三区黄色片| 国产一区二区三区在线视频| 乡村艳史在线观看| 精品视频一区在线| 一区在线免费观看| 一二三区视频在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 一区二区视频播放| 中文字幕日韩欧美在线视频| 偷拍视频一区二区三区| 欧美日韩综合久久| 久久国产日本精品| 五月天综合视频| 91成人免费电影| 国产福利小视频在线| 国产精品激情av在线播放| re久久精品视频| 天天影视综合色| 日本一区二区免费在线| 午夜一级黄色片| 揄拍成人国产精品视频| 成人国产一区| 正在播放一区| 国产激情91久久精品导航| 免费一级片视频| 精品久久久久久久一区二区蜜臀| 成人影音在线| 久久99导航| 久热国产精品| 久久精品色妇熟妇丰满人妻| 337p亚洲精品色噜噜| 永久免费网站在线| 国产精品一区免费观看| 亚洲综合国产激情另类一区| 久久精品国产亚洲av久| 欧美影视一区在线| 91小视频xxxx网站在线| 国产91亚洲精品一区二区三区| 在线播放日韩| 91久久免费视频| 欧美日韩五月天| 日本色护士高潮视频在线观看| 国内精品一区二区| 日韩精品免费专区| 国产美女久久久久久| 精品噜噜噜噜久久久久久久久试看| 99爱在线视频| 一本色道久久综合亚洲二区三区| 国产一区二区电影| 六月丁香婷婷综合| 色小说视频一区| 136福利精品导航| 北条麻妃在线一区| 中文字幕一区三区| 日韩性xxxx| 成人国产精品色哟哟| 亚洲乱码久久| 成年人免费视频播放| 亚洲精品在线三区| 欧美综合影院| 成人免费aaa| 成人欧美一区二区三区在线播放| 色婷婷av一区二区三区之红樱桃| 国产精品99久久久久久www| 欧美激情1区2区3区| 亚洲 小说 欧美 激情 另类| 日韩欧美www| 91综合国产| 日本免费不卡一区二区| 国产精品第四页| 蝌蚪视频在线播放| 国产精品高清一区二区三区| 日本不卡一二三区黄网| av黄色在线看|