黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

解析 MyBatis 中 Mapper 生效的來龍去脈

瀏覽:181日期:2023-10-18 10:40:14
目錄一、MyBatis基本使用1.1 編寫配置文件1.2 編寫Mapper接口及測試方法1.3 結果二、源碼分析2.1 通過配置文件構建出 SqlSessionFactory2.2 獲取 SqlSession 對象2.3 根據 SqlSession 獲取 Mapper 代理2.4 通過 Mapper 代理,執行方法操作數據庫2.5 整體流程圖

最近閑了快有半個多月了,一直提不起興致再去看一些書籍(沒有以前瘋狂吸食知識的欲望了😓)。

不過這一兩天不知道是什么筋搭錯了非常想寫點什么,但又不知道寫點啥(苦惱)。所以我就結合了一下本人工作中經常用到但沒有深入的技術下手了,最后思來想去就選擇了 MyBatis 中 Mapper 文件這一塊的知識內容入手了。

以前只是知道寫一個 Mapper 接口,對應著再去寫一個 Mapper.xml 文件然后將 Mapper 接口位置和 Mapper.xml 文件位置通過 MyBatisConfig.xml 的配置文件關聯起來就可以非常方便的操作訪問數據庫,但究其原因確是說不上個所以然來(汗顏)。

那既然搞出了前因,后面就一起往下學咯!

解析 MyBatis 中 Mapper 生效的來龍去脈

一、MyBatis基本使用

一切都從最簡單的開始,所以先來回顧一下其基本的使用(不會吧不會吧,最基本的hello world別忘了)。

步驟:

1、首先我們要創建一個maven工程

2、添加MyBatis的依賴及MySQL依賴,如下:

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version></dependency>

3、再添加一個測試單元依賴吧,等會要通過測試單元進行測試

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version></dependency>

OK,到這一步項目的基本環境就搭建完畢了,下面就是正式的使用 MyBatis 框架相關的內容了。

1.1 編寫配置文件

在資源目錄下面創建下面兩個配置文件:

這里我們先準備數據庫連接信息的配置類:jdbc.properties

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/mybatistest?useUnicode=true&amp;characterEncoding=utf-8jdbc.username=rootjdbc.password=root

接著就是最重要的一個配置類了:MyBatisConfig.xml

<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE configuration PUBLIC '-//mybatis.org//DTD Config 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-config.dtd'><configuration> <!-- 導入數據庫配置文件的信息--> <properties resource='jdbc.properties'></properties> <!-- 配置setting屬性--> <settings><!-- 開啟了一個駝峰命名規則--><setting name='mapUnderscoreToCamelCase' value='true'/><!-- 日志--><setting name='logImpl' value='STDOUT_LOGGING'></setting> </settings> <!-- 配置數據庫--> <environments default='development'><environment id='development'> <transactionManager type='JDBC'/> <!-- 配置連接池 --> <dataSource type='POOLED'><property name='driver' value='${jdbc.driver}'/><property name='url' value='${jdbc.url}'/><property name='username' value='${jdbc.username}'/><property name='password' value='${jdbc.password}'/> </dataSource></environment> </environments> <!-- mappers中注冊我們所有寫的dao接口的實現(映射)文件--> <mappers><mapper resource='/.../IUserMapper.xml'/><!-- 如果映射文件有十幾百個的話,可以用下面的全局注冊 <package name='文件所在包路徑'></package> <package name='cn.liuliang.Dao'></package> --> </mappers></configuration>1.2 編寫Mapper接口及測試方法

Mapper接口類

public interface IUserMapper { /** * 查詢所有用戶 * @return */ List<User> findAll();}

開始測試

public class MyBatisTest { @Test public void test01() throws IOException {// 讀取配置文件InputStream in= Resources.getResourceAsStream('MyBatisConfig.xml');// 創建sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);// 獲得會話SqlSession session=sqlSessionFactory.openSession();// 得到代理IUserMapper iUserMapper =session.getMapper(IUserMapper.class);// 查詢數據庫List<User> userList= iUserMapper.findAll();for (User user : userList) { System.out.println(user);} }}1.3 結果

解析 MyBatis 中 Mapper 生效的來龍去脈

SQL和結果都打印出來了😁。

以后,只要是對數據庫的操作,我們就只需要編寫 Mapper 接口和其對應的 xml 文件就可以非常快速操作數據庫,對比以前原生JDBC操作什么拼接SQL、結果集映射、資源關閉一大堆操作讓我們開發人員來處理,也太雞肋了吧!所以對于這個 MyBatis 持久層框架我只想說(牛逼)。

下面就要全程高能哦!但其實也很簡單了,它就只是把原生操作的 JDBC 進行了封裝,暴露出按照它所定義的簡單規則走而已,多的不說了,你們有資格一睹 MyBatis 源碼的芳容了。

解析 MyBatis 中 Mapper 生效的來龍去脈

二、源碼分析

既然要分析源碼了,那么從什么地方入手呢!— 測試方法

通過測試方法,我們可以知道 MyBatis 會先加載資源文件(MyBatisConfig.xml),因為這文件是一切的開始,通過這個文件可以知道數據源、特性(日志,駝峰命名…)、Mapper 文件等一系列信息。

2.1 通過配置文件構建出 SqlSessionFactory

第一個類名出現了:SqlSessionFactory ,它的類圖如下:

解析 MyBatis 中 Mapper 生效的來龍去脈

簡單熟悉一下圖中出現的名字吧:

SqlSessionFactory接口:SqlSessionFactory 負責創建 SqlSession 對象,其中只包含了多個 openSession() 方法的重載,可以通過其參數指定事務的隔離級別、底層使用 Executor 的類型以及是否自動提交事務等方面的配置。

DefaultSqlSessionFactory類:一個具體的工廠,實現了 SqlSessionFactory 接口。它主要提供了兩種創建 DefaultSqlSession 對象的方式:

通過數據源獲取數據庫連接,并創建 Executor 對象及 DefaultSqlSession 。 通過用戶提供的數據連接對象,DefaultSqlSessionFactory 會使用該數據庫連接對象創建 Executor 對象及 DefaultSqlSession。

SqlSessionManager類:同時實現了 SqlSession 接口和 SqlSessionFactory 接口 ,也就同時提供了SqlSessionFactory 創建 SqlSession 以及 SqlSession 操縱數據庫的功能。

SqlSession接口:是mybatis的核心操作類,其中對數據庫的crud都封裝在這個中,是一個頂級接口,其中默認實現類是DefaultSqlSession這個類。

DefaultSqlSession類:默認 SqlSession 接口的 CRUD 實現類,且 DefaultSqlsession 不是線程安全的(對于線程安全,關注session和connnect的關系就好了)

好了開始分析,從第一行代碼入手:

// 讀取配置文件InputStream in= Resources.getResourceAsStream('MyBatisConfig.xml');// 創建sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);

SqlSessionFactoryBuilder # build

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { // ... // 根據文件流,創建 XMLConfigBuilder 對象 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); // 先解析 配置文件,然后構建出 SqlSessionFactory對象 return build(parser.parse()); // ...}

最終會創建一個 DefaultSqlSessionFactory 對象返回出去

public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config);}

流程如下:

解析 MyBatis 中 Mapper 生效的來龍去脈

2.2 獲取 SqlSession 對象

在獲取到會話工廠之后,就是根據工廠獲得具體的會話了。

代碼入口:

// 獲得會話SqlSession session=sqlSessionFactory.openSession();

調用:DefaultSqlSessionFactory # openSession()

public SqlSession openSession() { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);}

最終來到:DefaultSqlSessionFactory # openSessionFromDataSource()

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try {// 根據配置文件 configuration 獲取對應的會話環境(包括事物,數據源)final Environment environment = configuration.getEnvironment();// 獲取事物工廠final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);// 根據數據源,配置事物,autoCommit:是否自動提交事物tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);// 根據配置獲取執行器(最終都是它執行對應的數據庫操作)final Executor executor = configuration.newExecutor(tx, execType);// 準備好上面的信息之后,都封裝到默認會話對象中返回出去return new DefaultSqlSession(configuration, executor, autoCommit); } catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException('Error opening session. Cause: ' + e, e); } finally {ErrorContext.instance().reset(); }}

在獲取 SqlSession 對象的過程中,都是根據默認的會話工廠,從工廠中獲取對應的會話。這樣在我看來非常的不錯,因為獲取一個數據庫的操作會話是需要配置非常多的屬性的,包括數據源配置、事物配置等。但是有了這個創建會話工廠類之后,那么一切就變得簡單起來了,工廠囊括了所有的細節,只需要我們調一個對外的 API 我們就可以獲得對應的 SqlSession 對象(工廠幫我們做了細節),進而操作數據庫,讀了上面的代碼就是一個很好的提現😀。

提一點:

配置文件(MyBatisConfig.xml)構造出默認會話工廠(SqlSessionFactory),工廠再創建出具體的操作數據庫會話(SqlSession)

2.3 根據 SqlSession 獲取 Mapper 代理

在上面,已經分析了如何獲取一個會話的源碼,那我們得到一個會話之后,就是要根據具體的 Mapper 接口獲得對應的操作數據庫代理對象了,就是下面這段代碼:

// 得到代理IUserMapper iUserMapper =session.getMapper(IUserMapper.class);

點進去看看

因為 session 對象是由 DefaultSqlSessionFactory 創建出來的 DefaultSqlSession,所以該代碼位于此類中

public <T> T getMapper(Class<T> type) { // 根據配置類,獲取 Mapper return configuration.getMapper(type, this);}

點進去:Configuration # getMapper

public <T> T getMapper(Class<T> type, SqlSession sqlSession) { // 從 mapperRegistry 中獲取具體 Mapper return mapperRegistry.getMapper(type, sqlSession);}

MapperRegistry:可以理解為 Mapper 接口的注冊中心,里面存放了所有 Mapper 接口相關屬性。

MapperRegistry# getMapper

public <T> T getMapper(Class<T> type, SqlSession sqlSession) { // knownMappers,一個Map,存放 Mapper 代理工廠 // 在初始化的時候根據配置文件已經將所有配置的 Mapper 接口注冊到此了 final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); if (mapperProxyFactory == null) {throw new BindingException('Type ' + type + ' is not known to the MapperRegistry.'); } try {// 具體代理生成return mapperProxyFactory.newInstance(sqlSession); } catch (Exception e) {throw new BindingException('Error getting mapper instance. Cause: ' + e, e); }}

點進具體代理:MapperProxyFactory # newInstance

public T newInstance(SqlSession sqlSession) { // 根據 SqlSession 和 Mapper 接口生成代理對象 final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface, methodCache); // 真正代理,如下 return newInstance(mapperProxy);}// 下面就是根據 JDK 原生 API 進行代理了,由此返回代理對象給用戶使用protected T newInstance(MapperProxy<T> mapperProxy) { return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);}

以上就是 Mapper 接口被代理的全部流程了,其中先是根據會話去獲得對應的 Mapper 但其內部調用的是 Mapper 注冊中心(MapperRegistry)獲取,這里面有所有配置的 Mapper 接口,在 MapperRegistry 中維護了一個 Map 鍵為 Class 值是 MapperProxyFactory ,這樣就可以獲得要代理 Mapper 接口的代理工廠,最后通過這個工廠生成我們想要的 Mapper 返回用戶。

流程不復雜,就是里面出現了很多 MapperXXX 相關的類,那么下面我梳理一下這些類關系圖如下:

解析 MyBatis 中 Mapper 生效的來龍去脈

對于具體的代理執行類這一步就要到執行這一塊了,當用戶通過我們返回的代理類(Mapper 接口)執行對應方法時,就會走到圖中涉及的類。

按照慣例,來個流程圖吧!

解析 MyBatis 中 Mapper 生效的來龍去脈

2.4 通過 Mapper 代理,執行方法操作數據庫

上面的所有分析,都是為了等到一個具體的操作數據庫的一個橋梁,那就是 Mapper 代理了(iUserMapper)。

接下來就是分析最后一步了,真正操作數據庫,代碼如下:

// 查詢數據庫List<User> userList= iUserMapper.findAll();for (User user : userList) { System.out.println(user);}

對于 iUserMapper 對象,我們知道他是代理去執行的,所以直接點進去的話根本行不通,那么我們可以通過 Debug 進去看看。

解析 MyBatis 中 Mapper 生效的來龍去脈

MapperProxy # invoke

@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try {// 方法的類為 object 直接通過原始 JDK 去執行if (Object.class.equals(method.getDeclaringClass())) { return method.invoke(this, args);} else { // 根據方法,獲得方法的執行器后再執行代理方法 return cachedInvoker(method).invoke(proxy, method, args, sqlSession);} } catch (Throwable t) {throw ExceptionUtil.unwrapThrowable(t); }}

我們先進入 MapperProxy # cachedInvoker 這個方法看看

private MapperMethodInvoker cachedInvoker(Method method) throws Throwable { try {// 先查緩存,有就返回,沒有就創建MapperMethodInvoker invoker = methodCache.get(method);if (invoker != null) { return invoker;}return methodCache.computeIfAbsent(method, m -> { // ... // 返回 PlainMethodInvoker 類型的 Mapper 方法執行器 return new PlainMethodInvoker(new MapperMethod(mapperInterface, method, sqlSession.getConfiguration())); // ...}); } catch (RuntimeException re) {Throwable cause = re.getCause();throw cause == null ? re : cause; }}

接著進入 PlainMethodInvoker# invoke 這個方法

public Object invoke(Object proxy, Method method, Object[] args, SqlSession sqlSession) throws Throwable { // 調用 mapperMethod 對象的 execute 方法去真正執行了 return mapperMethod.execute(sqlSession, args);}

真正執行的開始 execute

MapperMethod # execute

public Object execute(SqlSession sqlSession, Object[] args) { // 這里面內容比較多,我簡單分析一下 // 1)封裝參數 // 2)根據對應的執行類型(INSERT,UPDATE,DELETE,SELECT),執行對應的方法 // 3)根據參數,執行類型封裝對應的 sql // 4)操作原生 JDBC API 執行數據庫操作 // 5)封裝結果集,返回出去}

我們 Debug 這個方法最后一步,看看結果:

解析 MyBatis 中 Mapper 生效的來龍去脈

到此,我們的 Mapper 接口及文件生效的原理,就全部過了一邊,是不是覺得不是很難呢!

在分析這一塊源碼時,本人理解的步驟就是:

一步步點進源碼看。 畫出流程圖,不清楚的就 Debug。 很重要一點,對很多出現類似名字的類,一定要畫出類圖,搞清楚關系在往下走(助于理解每個類的職責)。 最后,那就是寫點筆記了,畢竟好記性不如爛筆頭。2.5 整體流程圖

解析 MyBatis 中 Mapper 生效的來龍去脈

到此這篇關于解析 MyBatis 中 Mapper 生效的前因后果的文章就介紹到這了,更多相關 MyBatis 中 Mapper 生效內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 国产午夜不卡片免费视频 | 国产综合视频一区二区三区 | 国产无遮挡a片又黄又爽 | 亚洲色图偷窥自拍 | 国产精品久久久久久久泡妞 | 亚洲一区二区三区不卡视频 | 亚洲a∨国产av综合av网站 | 午夜国产片 | 国产人碰人摸人爱免费视频 | 国产一区日本 | 天天做天天看 | 久久亚洲天堂 | 噜噜噜av久久av牛牛 | 国产乱淫av片杨贵妃 | 爽欲亲伦97部 | www788com色淫免费 | 99ri精品| 国产三级做人爱c视频 | 红桃视频 国产 | 国产精品视频久久久 | 久久精品久久综合 | www爱爱| 色片网站在线观看 | 九九综合九色综合网站 | 免费观看性行为视频的网站 | 成人激情站 | 亚洲一区二区三区四区不卡 | 欧美理伦在线观看 | 欧美在线看片 | 国产精品久久久久久久久久新婚 | 激情综合色 | 天天搞天天 | 真实乱视频国产免费观看 | 超薄肉色丝袜一二三四区 | 上原亚衣av一区二区三区 | 国产精品日本一区二区不卡视频 | 国产成人欧美一区二区三区的 | 国产精品夜夜夜爽阿娇 | 国产伦精品一区二区三区视频免费 | 国产欧美一区二区在线观看 | 国内精品久久久久久久日韩 | 91久久极品少妇韩国 | 噼里啪啦免费观看 | 91精品国产欧美一区二区成人 | 国产无遮挡裸体免费视频在线观看 | 国产精品永久免费 | www免费av| 青青青青青操 | 精品国产乱码久久久久久口爆网站 | 男女黄网站| 久久国产精品免费一区二区三区 | 午夜在线国语中文字幕视频 | 亚洲jizzjizz | 大尺度做爰啪啪高潮床戏 | 中文字幕2018| 在线一区二区三区视频 | 亚洲成人精品一区 | 国产福利姬喷水福利在线观看 | а√天堂资源中文在线官网九色 | 中文文字幕文字幕肉岳 | 午夜精品一区二区三区免费视频 | 欧美大片大全 | 67194av| 一级持黄录像免费观看 | 国产男人的天堂 | 麻豆视频精品 | 国产精品一区在线 | 国产精品xxx在线 | 成人免费视频一区二区 | 91亚洲区 | 日韩欧美不卡在线 | 大肉大捧一进一出视频 | 亚洲爆乳大丰满无码专区 | 久久免费国产 | 麻豆精品av | 又大又硬又黄的免费视频 | q2002日韩午夜伦高清 | 牛牛影视一区二区三区免费看 | 国产浮力影院 | 国产精品高潮呻吟视频 | 成年男人裸j网站 | 天天操操操操 | 又湿又紧又大又爽a视频国产 | 在厨房被c到高潮a毛片奶水 | 精品久久久久久久久久岛国gif | 偷拍激情视频一区二区三区 | 蜜桃91精品入口 | 老汉色老汉首页a亚洲 | 国产女主播在线观看 | 国产亚洲日韩在线a不卡 | 成 人色 网 站 欧美大片在线观看 | 黄色小视频在线看 | 中国亚洲女人69内射少妇 | www.se五月| 视频一区三区 | 空姐毛片| 无码熟妇αⅴ人妻又粗又大 | 亚洲一卡二卡 | 国产精品久久人 | www欧美日韩 | 亚洲色大成网站www久久九 | 国产成人精品三级麻豆 | 欧美三级午夜理伦三级 | 亚洲欧洲日韩一区二区三区 | 国产狂喷潮在线观看 | 国产美女在线观看免费 | 国产精品美女久久久久久久网站 | 国产精品无码一区二区三级 | 91啪在线观看 | 爱情岛论坛av首页 | 日本一区高清 | 国产视频一区二区三区在线观看 | 亚洲色欲色欲天天天www | 午夜寂寞少妇aaa片毛片 | 网站黄在线 | 中文字幕色偷偷人妻久久 | 少妇高潮惨叫久久久久电影69 | 成人毛片一区二区三区 | 亚洲日本在线观看 | 日韩欧美极品 | 老牛嫩草一区二区三区眼镜 | 中文韩国午夜理伦三级好看 | 99久久精品美女高潮喷水 | 欧美激情国产日韩精品一区18 | 女人扒开腿让男人桶到爽 | 久久久久久久久久久av | 日本少妇做爰大尺裸体视频 | 可以看片的网站色 | 欧美日韩大片在线观看 | 国产精品亚洲精品一区二区三区 | 日韩在线激情视频 | 亚洲富人天堂视频 | 热99这里只有精品 | 欧美激情自拍 | 国产亚洲日韩一区二区三区 | 高清一区在线观看 | 欧美交a欧美精品喷水 | а√天堂中文在线资源8 | 奶波霸巨乳一二三区乳 | 永久免费未满蜜桃 | 在线观看91 | 怡红院av人人爰人人爽 | 免费看片免费播放国产 | 草草影院国产第一页 | 秋霞在线视频观看 | 色噜噜av| 在线综合av | 亚洲欧美一级久久精品国产特黄 | 欧美做受69 | 97国产爽爽爽久久久 | 五月天黄色网 | 青青草99| 折磨小男生性器羞耻的故事 | 欧美大片高清免费看 | 亚洲中文无码av永久 | 超碰人人99 | 中日韩精品视频在线观看 | 人善交类欧美重口另类 | 一本色道久久88加勒比—综合 | 秋霞欧美一区二区三区视频免费 | 一区二区三区视频免费 | 超碰97国产| 99热久久成人免费频精品2 | 欧美在线 | 亚洲 | www.啪| 抖音视频在线观看 | 五月婷婷色丁香 | 国产乱人伦偷精品视频免下载 | 精品国产18久久久久久依依影院 | 色一区二区三区 | www.人人草| 啪啪.com| 久久999精品久久久 久久999精品久久久有什么优势 | 欧洲免费av| 99国产欧美另类久久久精品 | 婷婷色综合 | 国产免费无遮挡吸奶头视频 | 国产嫩草在线观看 | 亚洲操| 少妇愉情理伦片丰满丰满午夜 | 亚洲精品乱码久久久久久写真 | 亚洲欧美日韩国产成人 | 欧美最顶级丰满的aⅴ艳星 欧美最黄视频 | 91日韩精品久久久久身材苗条 | 四川一级毛毛片 | 亚洲精品一区二区三区不卡 | 久久国产精品久久精品国产 | 影音先锋中文字幕在线播放 | 国产美女精品视频免费播放软件 | 无码中文av有码中文av | 97超碰人人模人人人爽人人爱 | 亚洲处破女av一区二区中文 | 人av在线 | 大胸美女被吃奶爽死视频 | 亚洲 成人 av | 成品人视频ww入口 | 啪啪五月天 | 91亚洲精品国产成人 | 俄罗斯毛片 | 中文字幕高清视频 | 大黑人交xxxxxhd性爽 | 国产又黄又硬又湿又黄 | 日韩精品久 | 成人精品一区二区三区中文字幕 | 亚洲国产精品久久久久久女王 | 久草手机在线视频 | 无码精品人妻一区二区三区漫画 | 日本午夜在线 | 婷婷成人基地 | 国产精品久久久久久婷婷动漫 | 无码精品人妻一区二区三区人妻斩 | 日韩一区二区三区久久 | 日韩国产一区二区 | cao在线| 国内精品久久久久影院男同志 | 又黄又爽又色成人免费视频体验区 | 亚洲天堂性 | 国产精品人妻一区夜夜爱 | 久久九九看黄一片 | 亚洲精品色午夜无码专区日韩 | 天天躁日日躁狠狠躁喷水软件 | 日韩精品视频在线免费观看 | 日本特级黄色录像 | 日日躁狠狠躁夜夜躁av中文字幕 | 华人少妇被黑人粗大的猛烈进 | 日韩av第一页在线播放 | 国产一区影院 | 国产精品1区2区3区在线观看 | 国产肉体xxxx裸体784大胆 | av潮喷大喷水系列无码 | 久久精品夜色噜噜亚洲a∨ 国产精品人人做人人爽 | 亚洲国产美女精品久久久 | 青青青视频在线 | 亚洲精品国产一区二区精华液 | 久久精品专区 | 青青草污| 伊人久久大香线焦av综合影院 | 亚洲天码中字 | 欧美午夜网 | 红杏出墙记 | 日韩成人精品一区二区 | 久久综合色之久久综合 | 一区二区三区激情 | 免费在线观看黄色片 | 美女啪啪无遮挡 | 国产高清在线精品一区二区三区 | 日韩美女啪啪 | 国产欲妇 | 特级毛片www| 日韩和一区二区 | 久草视频免费播放 | 少妇无码av无码一区 | 国产麻豆91欧美一区二区 | 野狼第一精品社区 | 欧美丰满熟妇xx猛交 | 欧美性xxxx最大尺码 | 黑人巨茎大战欧美白妇 | 精品中文字幕在线 | 国产精品久久久久国产三级传媒 | 午夜无码一区二区三区在线观看 | 99久久精品无码一区二区三区 | 亚洲人成网站在线播放2019 | 在线免费观看一区 | 久久99国产综合精品免费 | 日韩欧美在线一区二区三区 | 日本在线国产 | 好吊操这里有精品 | 久久精品免费国产 | 国产成人久久精品激情 | 简单av在线 | 亚洲熟伦熟女新五十路熟妇 | 久久激情五月丁香伊人 | 日韩第一色 | 精品日本一区二区三区在线观看 | 欧美爱爱免费视频 | 日本乱论视频 | 美女午夜激情 | 黄瓜污视频 | 深夜成人福利 | 99爱精品视频 | 国产免费一级特黄录像 | 国产成人亚洲在线观看 | 成人在线国产 | 加勒比中文无码久久综合色 | 日本一区二区久久 | 97精品视频在线 | 人妻夜夜爽天天爽三区丁香花 | 好看的国产精彩视频 | 永久免费在线观看av | 99久久精品无免国产免费 | 欧美大片网址 | 在线成人一区二区 | 中文字幕97 | 78色淫网站女女免费 | 免费观看黄色一级片 | 日韩美女乱淫aaa高清视频 | 午夜天堂在线观看 | 天天干夜夜骑 | 黄色a在线观看 | 久久久久夜色精品国产老牛91 | 国产精品国产三级国产普通 | 免费黄网站在线观看 | 在线国产小视频 | 久久a级片 | 国产肉体xxxx裸体137大胆 | 奇米影视奇奇米色狠狠色777 | 99久久免费精品国产免费高清 | porn国产| 成人黄色动漫在线观看 | 羞羞视频在线观看免费 | 啪啪免费视频网站 | 潮喷失禁大喷水无码 | 免费在线h| 国产精品女人精品久久久天天 | 91桃色国产在线播放 | 少妇激情一区二区三区 | 久久99精品热在线观看 | 欧美精品乱码久久久久久按摩 | 国产91精品看黄网站在线观看动漫 | 国产香蕉视频在线播放 | 人妻熟女一区二区aⅴ林晓雪 | 国产精品美女www爽爽爽视频 | 国产欧美又粗又猛又爽 | 一本一生久久a久久精品综合蜜 | 日韩久久网 | 豆花视频18成人入口 | 国产无遮挡裸体免费视频 | 91av在线看 | 欧洲亚洲精品 | 波多野吉衣一区二区 | 精品国产三级在线观看 | 欧美大片抢先看 | 97sesecom | 综合久久网 | 午夜福利三级理论电影 | 牛av在线| 精品国产乱码一区 | 精品国产性色无码av网站 | 噼里啪啦在线高清观看免费 | 午夜免费视频 | 狠狠干亚洲色图 | 人人妻人人妻人人片av | 国产免费观看久久黄av片 | 嫩草在线视频 | 色午夜一av男人的天堂 | 国产亚洲精品久久久久久大师 | 特黄视频 | 可以免费看的av网站 | 国产露双乳喂奶在线观看 | 日本视频在线观看免费 | 国产精品入口麻豆www | 国产性按摩 | 一区二区三区在线 | 欧 | 成人一级黄色片 | 岛国不卡 | 中文字幕亚洲情99在线 | 国内露脸中年夫妇交换 | 99av视频| av永久免费网站 | 欧美多毛肥胖老妇做爰 | 少妇的呻吟k8 | 欧美日韩一区在线播放 | 中文字幕免费在线 | 日本欧美国产一区二区三区 | 欧美有码视频 | 成人wwe在线观看视频 | 特黄毛片杨钰莹 | 岛国片在线播放97 | 日韩精品免费一区二区夜夜嗨 | 污视频免费在线观看 | 精品在线一区二区三区 | 4hu四虎永久在线观看 | 国产欧美日韩另类 | 在线一区二区三区做爰视频网站 | 日本一级黄色毛片 | 亚洲成人高清在线观看 | 亚洲精品国产精品乱码不卡 | 日本美女久久 | 日韩av一区二区在线播放 | 欧美视频一区二区三区四区在线观看 | 中文字幕福利视频 | 亚洲字幕av一区二区三区四区 | 看黄色小视频 | 性综合网| 精品国产乱码久久久久久果冻传媒 | 成人性视频免费看的鲁片 | 天天做天天爱天天综合网2021 | 国产精品无码一区二区在线 | 国产三级按摩推拿按摩 | 999福利视频 | 99久久精品国产同性同志 | 天天躁日日躁mmmmxxxx | 亚洲精品无码专区在线在线播放 | 久久精品a亚洲国产v高清不卡 | 夜夜躁狠狠躁日日躁 | 日韩精品一区二区中文字幕 | 熟女人妇 成熟妇女系列视频 | 免费日韩一级片 | 欧美a级免费 | 国产网站免费在线观看 | 一区一区三区四区产品动漫 | 国产精品乱码高清在线观看 | 欧美一区二区三区粗大 | 国产农村妇女毛片精品久久 | 国产无套粉嫩白浆内谢在a 国产无套粉嫩白浆内谢在线 | 大狠狠大臿蕉香蕉大视频 | 成人涩涩日本国产一区 | 成年女人午夜毛片免费视频 | 欧美精品久久久久a | 成年女人免费视频播放体验区 | 国产成人在线一区二区 | 午夜国产精品成人 | 久久人人玩人妻潮喷内射人人 | 69视频在线观看免费 | av首页在线| 色爽 av| 国产精品一区二区久久精品爱微奶 | 影音先锋中文在线 | 亚洲国产二区 | 国产超碰人人模人人爽人人添 | 欧美日韩a√| 人妻丰满熟妇aⅴ无码 | 国产成网站18禁止久久影院 | 成人激情小视频 | 国产91精品欧美 | 在线国产片 | 精品女同一区二区三区在线 | 国产精品久久久久久在线观看 | 国产精品九| 国产乱妇乱子在线播视频播放网站 | 亚洲另类春色偷拍在线观看 | 40一50一60老女人毛片 | 69精品久久 | 国产无遮挡aaa片爽爽 | 中文字幕在线视频免费观看 | 国产乱码精品一区二区三区爽爽爽 | 欧美日韩综合视频 | 欧洲男女做爰免费视频 | 大地资源网中文第五页 | 成人h视频在线 | 91精品国自产在线 | 欧美日在线 | 久久久无码精品亚洲日韩蜜桃 | 国产三级手机在线 | 近伦中文字幕 | 免费a级毛片大学生免费观看 | 国模静欣大尺度激情啪啪 | 男女羞羞羞视频午夜视频 | 爱爱视频一区 | 国产美女永久无遮挡 | 国内自拍偷区亚洲综合伊人 | 一区久久 | 四虎国产精品成人永久免费影视 | 新狼窝色av性久久久久久 | 成人自拍av | 一本岛高清乱码2020叶美 | 97视频在线播放 | 日韩美女一区二区三区 | 亚洲天堂最新 | 国产黄a三级三级三级av在线看 | 精产国品一二三区 | 尤物av无码色av无码 | 成人免费视频国产免费 | 欧美日韩免费观看一区=区三区 | 香蕉视频一区二区 | 91嫩草亚洲精品 | 黄色福利片 | 国产69久久精品成人看动漫 | 国产小视频一区 | 波多野结衣一区二区三区在线观看 | 日本少妇北岛玲xxxhd | 国产色无码精品视频免费 | 欧美性大战久久久 | 男人天堂最新网址 | 琪琪色影音先锋 | 欧美午夜一区二区三区免费大片 | 国产高清在线观看 | 亚欧在线播放 | 美美女高清毛片视频免费观看 | 国产免费一区二区三区免费视频 | 黑人巨大猛交丰满少妇 | 日本丰满大乳mm | 国产成人毛毛毛片 | 亚洲 欧美 日韩在线 | 韩国毛片一区二区三区 | 亚洲午夜激情 | 侵犯の奶水授乳羞羞游戏 | 欧洲无线码一二三四区 | 一级免费片 | 亚洲色av天天天天天天 | 色哟哟一区二区三区精华液 | 蜜臀av无码一区二区三区 | 国产精品欧美大片 | 成人区人妻精品一区二区不卡视频 | 国产又粗又猛又黄又爽无遮挡 | 天天摸天天碰天天添 | 91九色视频网站 | 一级黄色网 | 免费又色又爽又黄的成人用品 | 少妇高潮一区二区三区99小说 | 丝袜+亚洲+另类+欧美+变态 | 中文字幕国产日韩 | 色婷婷综合久久久中文字幕 | 久久尤物免费一区二区三区 | 国产精品捆绑调教网站 | 久久久午夜精品 | 又污又黄又无遮挡的网站 | 男女啪啪做爰高潮无遮挡 | 国产又粗又猛又大爽 | 久久久女女女女999久久 | 91丨国产丨香蕉|入口 | www.污在线观看 | 免费大片黄在线观看视频网站 | 性a视频 | 欧美中文在线视频 | 国产毛a片啊久久久久久保和丸 | 久久久久久久久久久久久久国产 | 看黄a大片日本真人视频直播 | 免费观看亚洲视频 | 免费欧美黄色片 | av无码一区二区三区 | 久久成人18免费网站 | 伊人色爱 | av网址免费在线观看 | 国产裸体无遮挡免费精品视频 | 日韩一级一区 | 丁香天五香天堂综合 | 亚洲无卡 | 色婷亚洲 | 偷窥自拍五月天 | 亚洲毛片在线观看 | 中国少妇做爰全过程毛片 | 成人免费视频免费观看 | av爱爱爱 | 凹凸日日摸天天碰免费视频 | 国产精品国产三级国产普通话蜜臀 | 国产变态拳头交视频一区二区 | 国内自拍在线观看 | 色a在线| 日本精品视频一区二区三区 | 成人福利视频一区二区 | 国产91丝袜在线观看 | 欧美猛交ⅹxxx乱大交视频 | 欧美肥婆性猛交xxxⅹ | 国产一区二区三区视频网站 | 日本阿v免费观看视频 | 久久久久成人网站 | 亚洲欧洲自拍拍偷精品 美利坚 | 亚洲成人一区二区 | 好吊妞视频788gao在线观看 | 久久精品国产色蜜蜜麻豆 | 91小视频在线观看 | 国产全肉乱妇杂乱视频1 | 午夜三级在线 | 日本午夜一区二区 | 国产又猛又粗 | 久章草在线精品视频免费观看 | 亚洲综合色丁香婷婷六月图片 | 精品欧美一区二区久久久 | 免费中文熟妇在线影片 | 高清av网址 | 欧美大片在线看免费观看 | 护士人妻hd中文字幕 | 国产亚洲精品久久yy50 | 欧美日韩高清在线播放 | 把女邻居弄到潮喷的性经历 | 欧美黄色一区二区三区 | 成人免费视频免费观看 | 韩国三级一区 | 黄色国产片| 最近中文字幕在线中文视频 | 一区二区在线观看免费 | 日韩中文在线字幕 | 一本色道久久综合亚洲精品按摩 | 黑人jizz60性黑人 | 精品欧洲av无码一区二区男男 | 国产91高潮流白浆在线麻豆 | 欧美国产日韩亚洲中文 | 国产乱人偷精品视频 | 麻豆视频在线观看免费网站 | 国产精品久久久久久久久久影院 | 国产黄色片免费观看 | 欧美视频福利 | 国产999在线| 老牛嫩草一区二区三区眼镜 | 色妞视频男女视频 | 无码熟妇人妻av在线电影 | 中国肥胖女人真人毛片 | 毛片在线网址 | 日韩av在线播放观看 | 欧美一级黄 | aaa级吃奶摸下免费视频 | 在线精品亚洲观看不卡欧 | 国产精品丝袜久久久久久不卡 | 日韩少妇内射免费播放18禁裸乳 | av鲁丝一区鲁丝二区鲁丝三区 | av导航在线观看 | √资源天堂中文在线视频 | 国产日产欧产精品精品首页 | 99这里只有精品视频 | 亚洲欧美精品suv | 国产精品视频偷伦精品视频 | 麻豆传媒av在线播放 | 三级自拍 | 亚洲一区二区在线观看视频 | 夜夜操夜夜操 | 国产日韩不卡 | 国产精品99久久久久人中文网介绍 | 无码av免费一区二区三区试看 | 中文字幕视频一区 | 欧美肥婆性猛交xxxⅹ | 国产午夜精品久久久久久久久久 | 91久久精品国产91久久 | 视色影院 | 在线看片黄|