久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

瀏覽:174日期:2023-10-18 10:40:14
目錄一、MyBatis基本使用1.1 編寫配置文件1.2 編寫Mapper接口及測(cè)試方法1.3 結(jié)果二、源碼分析2.1 通過(guò)配置文件構(gòu)建出 SqlSessionFactory2.2 獲取 SqlSession 對(duì)象2.3 根據(jù) SqlSession 獲取 Mapper 代理2.4 通過(guò) Mapper 代理,執(zhí)行方法操作數(shù)據(jù)庫(kù)2.5 整體流程圖

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

不過(guò)這一兩天不知道是什么筋搭錯(cuò)了非常想寫點(diǎn)什么,但又不知道寫點(diǎn)啥(苦惱)。所以我就結(jié)合了一下本人工作中經(jīng)常用到但沒(méi)有深入的技術(shù)下手了,最后思來(lái)想去就選擇了 MyBatis 中 Mapper 文件這一塊的知識(shí)內(nèi)容入手了。

以前只是知道寫一個(gè) Mapper 接口,對(duì)應(yīng)著再去寫一個(gè) Mapper.xml 文件然后將 Mapper 接口位置和 Mapper.xml 文件位置通過(guò) MyBatisConfig.xml 的配置文件關(guān)聯(lián)起來(lái)就可以非常方便的操作訪問(wèn)數(shù)據(jù)庫(kù),但究其原因確是說(shuō)不上個(gè)所以然來(lái)(汗顏)。

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

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

一、MyBatis基本使用

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

步驟:

1、首先我們要?jiǎng)?chuàng)建一個(gè)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、再添加一個(gè)測(cè)試單元依賴吧,等會(huì)要通過(guò)測(cè)試單元進(jìn)行測(cè)試

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

OK,到這一步項(xiàng)目的基本環(huán)境就搭建完畢了,下面就是正式的使用 MyBatis 框架相關(guān)的內(nèi)容了。

1.1 編寫配置文件

在資源目錄下面創(chuàng)建下面兩個(gè)配置文件:

這里我們先準(zhǔn)備數(shù)據(jù)庫(kù)連接信息的配置類: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

接著就是最重要的一個(gè)配置類了: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> <!-- 導(dǎo)入數(shù)據(jù)庫(kù)配置文件的信息--> <properties resource='jdbc.properties'></properties> <!-- 配置setting屬性--> <settings><!-- 開啟了一個(gè)駝峰命名規(guī)則--><setting name='mapUnderscoreToCamelCase' value='true'/><!-- 日志--><setting name='logImpl' value='STDOUT_LOGGING'></setting> </settings> <!-- 配置數(shù)據(jù)庫(kù)--> <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中注冊(cè)我們所有寫的dao接口的實(shí)現(xiàn)(映射)文件--> <mappers><mapper resource='/.../IUserMapper.xml'/><!-- 如果映射文件有十幾百個(gè)的話,可以用下面的全局注冊(cè) <package name='文件所在包路徑'></package> <package name='cn.liuliang.Dao'></package> --> </mappers></configuration>1.2 編寫Mapper接口及測(cè)試方法

Mapper接口類

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

開始測(cè)試

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

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

SQL和結(jié)果都打印出來(lái)了😁。

以后,只要是對(duì)數(shù)據(jù)庫(kù)的操作,我們就只需要編寫 Mapper 接口和其對(duì)應(yīng)的 xml 文件就可以非常快速操作數(shù)據(jù)庫(kù),對(duì)比以前原生JDBC操作什么拼接SQL、結(jié)果集映射、資源關(guān)閉一大堆操作讓我們開發(fā)人員來(lái)處理,也太雞肋了吧!所以對(duì)于這個(gè) MyBatis 持久層框架我只想說(shuō)(牛逼)。

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

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

二、源碼分析

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

通過(guò)測(cè)試方法,我們可以知道 MyBatis 會(huì)先加載資源文件(MyBatisConfig.xml),因?yàn)檫@文件是一切的開始,通過(guò)這個(gè)文件可以知道數(shù)據(jù)源、特性(日志,駝峰命名…)、Mapper 文件等一系列信息。

2.1 通過(guò)配置文件構(gòu)建出 SqlSessionFactory

第一個(gè)類名出現(xiàn)了:SqlSessionFactory ,它的類圖如下:

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

簡(jiǎn)單熟悉一下圖中出現(xiàn)的名字吧:

SqlSessionFactory接口:SqlSessionFactory 負(fù)責(zé)創(chuàng)建 SqlSession 對(duì)象,其中只包含了多個(gè) openSession() 方法的重載,可以通過(guò)其參數(shù)指定事務(wù)的隔離級(jí)別、底層使用 Executor 的類型以及是否自動(dòng)提交事務(wù)等方面的配置。

DefaultSqlSessionFactory類:一個(gè)具體的工廠,實(shí)現(xiàn)了 SqlSessionFactory 接口。它主要提供了兩種創(chuàng)建 DefaultSqlSession 對(duì)象的方式:

通過(guò)數(shù)據(jù)源獲取數(shù)據(jù)庫(kù)連接,并創(chuàng)建 Executor 對(duì)象及 DefaultSqlSession 。 通過(guò)用戶提供的數(shù)據(jù)連接對(duì)象,DefaultSqlSessionFactory 會(huì)使用該數(shù)據(jù)庫(kù)連接對(duì)象創(chuàng)建 Executor 對(duì)象及 DefaultSqlSession。

SqlSessionManager類:同時(shí)實(shí)現(xiàn)了 SqlSession 接口和 SqlSessionFactory 接口 ,也就同時(shí)提供了SqlSessionFactory 創(chuàng)建 SqlSession 以及 SqlSession 操縱數(shù)據(jù)庫(kù)的功能。

SqlSession接口:是mybatis的核心操作類,其中對(duì)數(shù)據(jù)庫(kù)的crud都封裝在這個(gè)中,是一個(gè)頂級(jí)接口,其中默認(rèn)實(shí)現(xiàn)類是DefaultSqlSession這個(gè)類。

DefaultSqlSession類:默認(rèn) SqlSession 接口的 CRUD 實(shí)現(xiàn)類,且 DefaultSqlsession 不是線程安全的(對(duì)于線程安全,關(guān)注session和connnect的關(guān)系就好了)

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

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

SqlSessionFactoryBuilder # build

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

最終會(huì)創(chuàng)建一個(gè) DefaultSqlSessionFactory 對(duì)象返回出去

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

流程如下:

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

2.2 獲取 SqlSession 對(duì)象

在獲取到會(huì)話工廠之后,就是根據(jù)工廠獲得具體的會(huì)話了。

代碼入口:

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

調(diào)用:DefaultSqlSessionFactory # openSession()

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

最終來(lái)到:DefaultSqlSessionFactory # openSessionFromDataSource()

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try {// 根據(jù)配置文件 configuration 獲取對(duì)應(yīng)的會(huì)話環(huán)境(包括事物,數(shù)據(jù)源)final Environment environment = configuration.getEnvironment();// 獲取事物工廠final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);// 根據(jù)數(shù)據(jù)源,配置事物,autoCommit:是否自動(dòng)提交事物tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);// 根據(jù)配置獲取執(zhí)行器(最終都是它執(zhí)行對(duì)應(yīng)的數(shù)據(jù)庫(kù)操作)final Executor executor = configuration.newExecutor(tx, execType);// 準(zhǔn)備好上面的信息之后,都封裝到默認(rèn)會(huì)話對(duì)象中返回出去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 對(duì)象的過(guò)程中,都是根據(jù)默認(rèn)的會(huì)話工廠,從工廠中獲取對(duì)應(yīng)的會(huì)話。這樣在我看來(lái)非常的不錯(cuò),因?yàn)楂@取一個(gè)數(shù)據(jù)庫(kù)的操作會(huì)話是需要配置非常多的屬性的,包括數(shù)據(jù)源配置、事物配置等。但是有了這個(gè)創(chuàng)建會(huì)話工廠類之后,那么一切就變得簡(jiǎn)單起來(lái)了,工廠囊括了所有的細(xì)節(jié),只需要我們調(diào)一個(gè)對(duì)外的 API 我們就可以獲得對(duì)應(yīng)的 SqlSession 對(duì)象(工廠幫我們做了細(xì)節(jié)),進(jìn)而操作數(shù)據(jù)庫(kù),讀了上面的代碼就是一個(gè)很好的提現(xiàn)😀。

提一點(diǎn):

配置文件(MyBatisConfig.xml)構(gòu)造出默認(rèn)會(huì)話工廠(SqlSessionFactory),工廠再創(chuàng)建出具體的操作數(shù)據(jù)庫(kù)會(huì)話(SqlSession)

2.3 根據(jù) SqlSession 獲取 Mapper 代理

在上面,已經(jīng)分析了如何獲取一個(gè)會(huì)話的源碼,那我們得到一個(gè)會(huì)話之后,就是要根據(jù)具體的 Mapper 接口獲得對(duì)應(yīng)的操作數(shù)據(jù)庫(kù)代理對(duì)象了,就是下面這段代碼:

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

點(diǎn)進(jìn)去看看

因?yàn)?session 對(duì)象是由 DefaultSqlSessionFactory 創(chuàng)建出來(lái)的 DefaultSqlSession,所以該代碼位于此類中

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

點(diǎn)進(jìn)去:Configuration # getMapper

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

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

MapperRegistry# getMapper

public <T> T getMapper(Class<T> type, SqlSession sqlSession) { // knownMappers,一個(gè)Map,存放 Mapper 代理工廠 // 在初始化的時(shí)候根據(jù)配置文件已經(jīng)將所有配置的 Mapper 接口注冊(cè)到此了 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); }}

點(diǎn)進(jìn)具體代理:MapperProxyFactory # newInstance

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

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

流程不復(fù)雜,就是里面出現(xiàn)了很多 MapperXXX 相關(guān)的類,那么下面我梳理一下這些類關(guān)系圖如下:

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

對(duì)于具體的代理執(zhí)行類這一步就要到執(zhí)行這一塊了,當(dāng)用戶通過(guò)我們返回的代理類(Mapper 接口)執(zhí)行對(duì)應(yīng)方法時(shí),就會(huì)走到圖中涉及的類。

按照慣例,來(lái)個(gè)流程圖吧!

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

2.4 通過(guò) Mapper 代理,執(zhí)行方法操作數(shù)據(jù)庫(kù)

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

接下來(lái)就是分析最后一步了,真正操作數(shù)據(jù)庫(kù),代碼如下:

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

對(duì)于 iUserMapper 對(duì)象,我們知道他是代理去執(zhí)行的,所以直接點(diǎn)進(jìn)去的話根本行不通,那么我們可以通過(guò) Debug 進(jìn)去看看。

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

MapperProxy # invoke

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

我們先進(jìn)入 MapperProxy # cachedInvoker 這個(gè)方法看看

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

接著進(jìn)入 PlainMethodInvoker# invoke 這個(gè)方法

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

真正執(zhí)行的開始 execute

MapperMethod # execute

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

我們 Debug 這個(gè)方法最后一步,看看結(jié)果:

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

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

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

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

解析 MyBatis 中 Mapper 生效的來(lái)龍去脈

到此這篇關(guān)于解析 MyBatis 中 Mapper 生效的前因后果的文章就介紹到這了,更多相關(guān) MyBatis 中 Mapper 生效內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
主站蜘蛛池模板: 国产一区二区av | 欧美日韩在线一 | 亚洲精品久久久久久久久久 | 日本免费网站 | 久久精品99 | 97精品视频在线 | 亚洲一区二区三区观看 | 精品视频久久 | 国产欧美精品区一区二区三区 | 亚洲精品国精品久久99热 | 欧美xxxⅹ性欧美大片 | 久久之精品 | 欧美日韩免费在线 | 国产精品一区二区三区四区 | 国产高清一区二区 | 色综合天天 | 色网网站 | 91精品国产乱码久久久久久久久 | 欧洲精品一区 | 欧美日韩欧美日韩 | 久久精品视频免费看 | 日本视频在线 | 日本久久www成人免 成人久久久久 | 亚洲一区视频 | 成人免费毛片高清视频 | 国产精品久久久久久久久久久久 | 综合久久精品 | 久久这里只有精品首页 | 亚洲精彩视频在线 | 国产精品国产精品国产专区不蜜 | 久久国产亚洲 | 国产成人午夜精品5599 | 欧美一级片在线观看 | 天天干人人 | 香蕉综合久久 | 成人免费在线网址 | 精品一区二区三区免费看 | 嫩草网址 | 中文字幕精品视频在线观看 | 欧美乱轮 | 天堂资源网 | 99久久日韩精品视频免费在线观看 | 日本理论片好看理论片 | 91在线 | 亚洲 | 国产一区二区在线免费观看 | 欧美一区二区三区久久精品 | 一区二区三区不卡视频 | 一二三区在线 | 国产精品久久久久久久竹霞 | 91精品在线看 | 日韩中文字幕av | 亚洲精品国精品久久99热 | 91精品久久久久久久 | 看毛片网 | 激情欧美日韩一区二区 | 精品欧美久久 | 久久成人精品视频 | 超碰8| 精品久久久久久久久久久久包黑料 | 欧美视频亚洲视频 | 欧美成人免费视频 | 在线欧美亚洲 | 亚洲欧美日韩精品久久亚洲区 | 这里有精品视频 | 国产精品国产三级国产aⅴ入口 | 国产精品久久久久久久久免费桃花 | 久久se精品一区精品二区 | 在线观看91视频 | 欧美日韩国产高清视频 | 一区二区国产在线 | 老牛嫩草一区二区三区眼镜 | 91久久久久久 | 久久久久久综合 | 国产乡下妇女做爰视频 | 免费视频一区二区三区在线观看 | 久久人人爽人人爽人人片av高清 | 亚洲一区二区三区在线播放 | 四虎影视免费在线观看 | 成人网在线观看 | 日韩字幕一区 | 亚洲精品一区二区 | 国产第一页在线播放 | 视频在线一区二区三区 | 中文字幕精品一区久久久久 | 国产精品自拍视频网站 | 影音先锋资源av | 日本久久久久久 | 亚洲男人的天堂在线观看 | 国产成人精品高清久久 | 日韩一区二区成人 | 久久精品国产99国产精2020新增功能 | 国产高清在线不卡 | 精品久久久av | www.com久久| 91秦先生艺校小琴 | 日本久久久久久 | 国产成人99久久亚洲综合精品 | 亚洲国产一区视频 | 欧美日韩高清不卡 | 亚洲精品欧美 | 91免费在线看 | 日比视频网站 | 国产精品视频一二三区 | 国产一区二区三区在线免费观看 | 久久久久久这里只有精品 | 桃色五月 | 国产一区二区三区免费看 | a一级黄| 日韩国产欧美视频 | 欧美一级艳片视频免费观看 | 黄a一级 | 操皮视频 | 国产福利精品一区 | 国产日韩一区 | 国产精品久久 | 日韩成人影院 | 亚洲国产成人av好男人在线观看 | 亚洲精品视频免费观看 | 99精品欧美一区二区蜜桃免费 | 亚洲一区二区av | 国产精品影视 | 亚洲精品国品乱码久久久久 | 久久久久国产一区 | 免费啪啪网站 | 国产精品毛片久久久久久久 | 久久国产成人 | 女人色网 | 国产乱人伦av在线a jizz久久久 www.亚洲 | 亚洲生活片 | 中文字幕av一区 | 亚洲男人av| 欧美成人免费在线视频 | 亚洲精品在线视频 | 日本不卡视频 | 北条麻妃一区二区三区在线观看 | 亚洲成人免费电影 | 91丁香| 涩涩视频网站在线观看 | 在线观看毛片网站 | 免费成人在线网站 | 欧美日本免费一区二区三区 | 综合伊人 | 高清一区二区三区 | 91精品视频一区 | 波多野结衣福利电影 | 不卡av电影在线观看 | 一区二区免费在线视频 | 在线一区二区三区做爰视频网站 | 日韩超级大片免费看国产国产播放器 | 日韩不卡一区二区三区 | 国产欧美精品一区二区三区 | 夜夜操天天干 | 日本在线免费 | 国产精品网站在线观看 | 国产高清视频 | 黑人巨大精品欧美一区二区小视频 | 能在线观看的黄色网址 | 99精品欧美一区二区三区综合在线 | 人人人人人你人人人人人 | 91社区在线观看高清 | 黄网在线观看 | 国产一区二区精品 | 国产欧美日韩成人 | 成人一二三区 | 特黄特色大片免费视频观看 | 乱人伦xxxx国语对白 | 久久久国产精品视频 | 成人久久久精品乱码一区二区三区 | 欧美成人免费在线视频 | 欧美日韩亚洲国产 | 福利视频一区 | 中文字幕一区二区在线观看 | 日韩av网页| 免费看一区二区三区 | 国产xvideos免费视频播放 | 在线中文字幕av | 亚洲精品日韩精品 | 日韩一区二区三区在线视频 | 久久久久久亚洲精品 | 欧美国产高清 | 成人精品免费视频 | 狠狠色综合欧美激情 | 男女视频一区二区 | 成人午夜在线视频 | a在线免费观看 | 欧美日韩国产一区二区三区 | 一区二区三区视频 | 亚洲精品乱码久久久久久久 | www.在线播放 | 国产一区二区三区免费看 | 亚洲精品久久久久久下一站 | 自拍第一页| 亚洲国产成人av好男人在线观看 | 成人动慢| 亚洲一区国产精品 | 亚洲精品在线免费看 | 久久久久免费精品视频 | 精品专区| 日韩精品久久理论片 | 一级视频在线免费观看 | 国产精品自产拍在线观看 | 亚洲欧美日韩国产综合 | 日韩一区二区三区av | 久久精品在线 | 亚洲国产高清高潮精品美女 | 精品美女久久久 | 日韩欧在线 | 女同理伦片在线观看禁男之园 | 久久免费国产 | 国产精品成人一区二区三区夜夜夜 | 色av一区 | 国产精品美女久久久久aⅴ国产馆 | 日本久久国产 | 国产91富婆养生按摩会所 | 国产日韩精品一区二区 | 精品一区二区三区在线视频 | 亚洲精品中文字幕 | 亚洲巨乳自拍在线视频 | 国产精品不卡 | 久久人人爽人人爽 | 天天操夜夜操免费视频 | av一级久久 | 亚洲二区视频 | 国产一级视频 | 精品久久久久久久人人人人传媒 | √8天堂资源地址中文在线 成人欧美一区二区三区白人 | 中文字幕日韩专区 | 亚洲国产精品久久人人爱 | 欧美日韩亚洲高清 | 欧美一区永久视频免费观看 | 中文字幕久久久 | 国产精品日本欧美一区二区三区 | 日韩1区| 精品1区 | 久久在线视频 | 999这里只有是极品 免费的一级黄色片 | 久久9视频 | 欧美乱淫 | 91在线视频福利 | 青青草在线视频免费观看 | 成人在线国产 | 亚洲精品一区在线观看 | 国产精品久久久久久久久软件 | www久久99 | 91精品综合久久久久久五月天 | 国产精品99久久 | 国产精品夜间视频香蕉 | 日本精品免费观看 | 精品免费国产视频 | 91在线激情 | 国产精品一二三 | 日韩国产高清在线 | 91影院在线观看 | 99精品欧美一区二区三区 | 久久涩 | 一级毛片观看 | 淫片一级国产 | 国产毛片视频 | 国产一区二区三区精品久久久 | 在线观看精品视频网站 | 国产精品视频导航 | 国产大学生援交视频在线观看 | 理论片免费在线观看 | 日本不卡高字幕在线2019 | 男女做爰高清无遮挡免费视频 | 国产在线2 | 中文乱码一区 | 一区二区三区日韩 | 亚洲一区二区在线视频 | 欧美三级在线视频 | 一级毛片,一级毛片 | 国产成人免费 | 一区二区三区欧美 | 情侣av | www日本高清 | 色av色av色av| 国产精品一区二区三区免费视频 | 在线观看欧美一区 | 国产xnxx | 亚洲免费在线视频 | 精品久久中文 | 精品国产一区二区三区久久久蜜月 | 在线中文字幕视频 | 亚洲精品一区二区网址 | 亚洲国产天堂久久综合 | 亚洲精品国品乱码久久久久 | 日韩欧美二区 | 能在线观看的黄色网址 | 亚洲美女av在线 | 精品中文字幕一区二区 | 激情综合久久 | 欧美国产一区二区 | 思热99re视热频这里只精品 | 激情视频在线观看免费 | 涩涩片影院 | 日韩成人影院 | 欧美精品日韩 | 99视频在线播放 | 国产精品无码久久久久 | 国产欧美精品一区二区色综合 | 国产亚洲精品久久久优势 | 国产一区二区三区高清 | 中文字幕日韩欧美一区二区三区 | www.久久99 | 99爱视频| 国产精品一区二区三区免费 | 午夜免费电影 | 天天天天天天天操 | 水卜樱一区二区av | 国产精品视频一区二区三区四蜜臂 | 日韩中文字幕在线免费观看 | 亚洲wu码 | 在线国产区 | 精品亚洲永久免费精品 | 婷婷激情综合 | 99re免费视频精品全部 | 亚洲国产精品99久久久久久久久 | 中文字幕国产一区 | 一区二区三区回区在观看免费视频 | 国产一区二区在线播放 | 精品日韩一区二区三区 | 99视频在线播放 | 中文字幕 视频一区 | 欧美精品在线观看 | a在线观看免费视频 | 国产一区中文字幕 | 亚洲国产精品99久久久久久久久 | 美女视频黄色免费 | 欧美一区二区在线播放 | 中文天堂av| 国产成人av一区二区三区 | 精品亚洲一区二区三区 | 伊人网站 | 欧美黄色一区 | 久久蜜桃av | 国产人成精品一区二区三 | 国产二区三区 | 欧亚视频在线观看 | 性欧美大战久久久久久久免费观看 | 高清视频一区 | 香蕉视频91 | 宅男lu666噜噜噜在线观看 | 天天插天天操天天干 | 亚洲午夜视频在线观看 | 欧美日韩二区三区 | 日韩精品一区二区三区在线 | 久久午夜电影 | 国产精品视频入口 | 男女免费视频 | 久久国产欧美一区二区三区精品 | 欧美日韩电影一区二区 | 国产精品久久久爽爽爽麻豆色哟哟 | 欧美一区二区在线视频 | 国产不卡免费视频 | 欧美 日韩 国产 一区 | 亚洲一区二区在线播放 | 国产精品三级久久久久久电影 | 久久久久亚洲av毛片大全 | 国产一区二区三区视频 | 夜夜骑日日操 | 久草免费在线 | 午夜激情福利视频 | 亚洲一区视频在线 | av一区二区三区四区 | 一级毛片免费播放 | 国产精品久久久久久婷婷天堂 | 国产精品嫩草55av | 亚洲国产日韩在线 | 精品国产一区二区三区高潮视 | 国产精品视频免费观看 | 99精品欧美一区二区蜜桃免费 | 亚洲欧美中文日韩在线v日本 | 成人亚洲免费 | 无套内谢孕妇毛片免费看红桃影视 | 天天精品在线 | 国产极品视频在线观看 | h视频在线免费观看 | 欧美在线一区二区三区 | 午夜在线电影 | 日韩亚洲视频 | 精品国产青草久久久久福利 | 欧美精品成人一区二区三区四区 | 国产精品69毛片高清亚洲 | 97伦理电影院 | 亚洲免费视频观看 | 久久国产高清 | 91在线精品秘密一区二区 | 欧美精品一区二区三区蜜桃视频 | 亚洲视频一区二区三区四区 | 成版人性视频 | 亚洲欧美中文字幕 | 性欧美精品高清 | 亚洲免费精品 | 日韩成人精品视频在线观看 | 久在线 | 国产精品久久免费视频 | 午夜国产精品视频 | 黄理论视频 | www.中文字幕 | 亚洲一区二区在线 | 中文av网站 | 日韩一区精品视频 | 另类 综合 日韩 欧美 亚洲 | 国产一区欧美 | 91人人澡人人爽 | 久久av一区二区三区 | 欧美在线一区二区三区 | 国产视频第一区 | 国产美女高潮一区二区三区 | 色www精品视频在线观看 | 蜜桃av人人夜夜澡人人爽 | 亚洲www啪成人一区二区 | 免费亚洲精品 | 97成人在线 | 日韩高清成人 | 国产成人精品av | 激情一区二区三区 | 中文字幕一区二区三区不卡 | 亚洲成人网一区 | av中文字幕在线播放 | 国产精一区二区 | 国产一区二区在线免费 | 免费成人在线视频网站 | 欧美精品免费在线观看 | 亚洲视频中文字幕 | 国产三区在线视频 | 9久久精品 | 在线天堂视频 | 久久av在线 | 国产精品久久久久久久岛一牛影视 | 伊人成人222| 日韩精品在线播放 | 伊人网伊人 | 久久激情视频 | 欧美第一视频 | 国产伦精品一区二区三区四区视频_ | 日韩一区二区免费视频 | 国产高清美女一级a毛片久久 | 成人久久久 | 天天干网 | 国产免费成人 | 草草视频在线观看 | 国产精品成人国产乱一区 | 国产精品看片 | 日韩有码一区 | 免费在线黄色av | 亚洲 欧美 日韩在线 | 亚洲午夜精品一区二区三区他趣 | 国产欧美综合一区二区三区 | 亚洲不卡在线观看 | 天天看天天干 | 美女毛片免费看 | 91精品国产91综合久久蜜臀 | 久久久免费 | 亚洲精品美女在线观看 | 欧美日韩中文字幕在线 | 亚洲一区二区三区四区在线观看 | 黄色片com | 日韩久久久久久 | 欧美一区二区黄色片 | 国产成人精品一区一区一区 | 在线精品亚洲 | 久久国产午夜 | 亚洲精品aaa| 一区二区在线视频 | 欧美一区二区黄色片 | 奇米精品一区二区三区在线观看 | 成人黄色片在线观看 | 欧美亚洲国产一区 | 中文字幕在线观看的电影 | 成人精品 | a视频在线观看免费 | 久久久久久久一区 | 综合 欧美 亚洲日本 | 水卜樱一区二区av | 宅男伊人 | 国产精品久久久久久婷婷天堂 | 亚洲一区二区三区四区在线 | 一区二区三区视频 | 国产一区欧美 | 成人午夜精品一区二区三区 | 国产精品久久一区 | 日韩国产一区 | 91成人免费在线视频 | 欧美一区二区三区在线看 | 一区二区三区四区视频 | 日本阿v视频高清在线中文 中文二区 | 亚洲欧美在线一区 | 亚洲国产欧美一区二区三区久久 | 国产精品视频播放 | 天天曰天天曰 | 色一情一乱一伦一区二区三区 | 先锋资源久久 | 蜜桃精品在线观看 | 伊人久久婷婷 | 日本中文字幕一区 | 久热免费在线观看 | 久久亚洲一区 | 国产激情视频 | 一本大道综合伊人精品热热 | 黄色网页在线观看 | 国产精品久久久久久吹潮 | 97超碰青青草 | 91免费电影| 欧美日韩视频 | 99热精品久久 | 久久毛片 | 91精品国产综合久久久久久丝袜 | 国产成人高清视频 | 成年人在线看片 | 九色91视频 | 久久久久久久国产 | 亚洲日本va中文字幕 | www.av在线| 求av网站 | 日韩在线视频第一页 | 久久精品亚洲一区二区 | 亚洲第一视频网站 | 中文字幕天天操 | 日韩成人在线观看 | 精品久久久久久久久久久 | 日韩av一区二区三区在线观看 | 亚洲精品福利 | av一区二区三区四区 | 国产区视频在线观看 | 成人免费在线观看 | 天天干天天爱天天 | 国产乱肥老妇国产一区二 | 一区视频 | 亚洲国产视频一区 | 久草精品视频 | 国产亚洲一区二区三区 | 狠狠狠干| 色婷婷av久久久久久久 | 超碰一区二区三区 | 成人激情免费视频 | 天天干天天操 | 精品国产鲁一鲁一区二区三区 | 黄色毛片在线看 | 久久久精品欧美一区二区免费 | 久热伊人 | 一道本一二三区 | 狠狠操精品视频 | av免费网| 日日摸日日碰夜夜爽亚洲精品蜜乳 | 色猫猫国产区一区二在线视频 | 成人h动漫在线看 | 亚洲一区二区三区四区五区午夜 | 国产视频久久久久久久 | 欧美一级裸体视频 | 国产片淫级awww | 亚洲精品在线网站 | 国内精品视频在线观看 | 97免费在线观看视频 | 久久国产精品毛片 | 亚洲成人观看 | 久久久精品国产 | 国产精品免费观看 | 国产成人亚洲精品 | 国产乱码精品一区二区三区忘忧草 | av片在线观看网站 | 欧美理论片在线观看 | 国产99久| 亚洲综合视频 | 久久久久国产一区二区三区四区 | 97碰碰碰 | 国产日韩精品在线 | 日本一区二区成人 | 亚洲精品久久 | 九九只有精品 | 夫妻午夜影院 | 亚洲精品在线国产 | 久久久久久网站 | 亚洲色图3p | 欧美精品在线观看免费 | 亚洲视频中文字幕 | 欧美永久精品 | 伊人网网站 | 精品久久久久久久久久久久久久 | 国产成人免费视频网站高清观看视频 | 久久久国产精品 | 天堂网av2020 | 国产大片aaa | av在线一区二区 | 二区在线观看 | 国产精品美女久久久久久久久久久 | 国产精品久久久久久久久久ktv | 精品免费视频 | 日韩欧美在线中文字幕 | 欧洲一区在线 | 美国一级黄色片 | 久草高清| 欧美日韩一区二区在线观看 | 一区视频在线 | 欧美日韩精品一区二区三区四区 | av在线免费观看一区二区 | 亚洲成av人片在线观看 | 啵啵影院午夜男人免费视频 | a一级黄| 狠狠插天天干 | 91精品啪啪 | 免费观看成人毛片 | 色综合欧美 | 午夜久久网站 | 欧美日韩亚洲二区 | 99re在线免费 | 欧美国产日韩视频 | 国产精品久久久久久久久大全 | 中文字幕在线观看一区二区三区 | 国产精品 日韩 | 精品国产髙清在线看国产毛片 | 亚洲欧美综合 | 日韩在线观看一区二区 | 国产人妖一区 | av免费网站在线观看 |