1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        MyBatis 架構(gòu)與原理

        共 16279字,需瀏覽 33分鐘

         ·

        2021-06-12 01:56

        z來源:jianshu.com/p/15781ec742f2

        • MyBatis功能架構(gòu)設(shè)計(jì)
        • 框架架構(gòu)
        • MyBatis核心類
        • MyBatis成員層次&職責(zé)

        MyBatis功能架構(gòu)設(shè)計(jì)

        功能架構(gòu)講解:

        我們把Mybatis的功能架構(gòu)分為三層:

        (1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫。接口層一接收到調(diào)用請(qǐng)求就會(huì)調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。

        (2)數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請(qǐng)求完成一次數(shù)據(jù)庫操作。

        (3)基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

        框架架構(gòu)

        框架架構(gòu)講解:

        這張圖從上往下看。MyBatis的初始化,會(huì)從mybatis-config.xml配置文件,解析構(gòu)造成Configuration這個(gè)類,就是圖中的紅框。

        (1)加載配置:配置來源于兩個(gè)地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個(gè)個(gè)MappedStatement對(duì)象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲(chǔ)在內(nèi)存中。

        (2)SQL解析:當(dāng)API接口層接收到調(diào)用請(qǐng)求時(shí),會(huì)接收到傳入SQL的ID和傳入對(duì)象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會(huì)根據(jù)SQL的ID找到對(duì)應(yīng)的MappedStatement,然后根據(jù)傳入?yún)?shù)對(duì)象對(duì)MappedStatement進(jìn)行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù)。

        (3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進(jìn)行執(zhí)行,得到操作數(shù)據(jù)庫的結(jié)果。

        (4)結(jié)果映射:將操作數(shù)據(jù)庫的結(jié)果按照映射的配置進(jìn)行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結(jié)果返回。

        MyBatis核心類

        1、SqlSessionFactoryBuilder

        每一個(gè)MyBatis的應(yīng)用程序的入口是SqlSessionFactoryBuilder。

        它的作用是通過XML配置文件創(chuàng)建Configuration對(duì)象(當(dāng)然也可以在程序中自行創(chuàng)建),然后通過build方法創(chuàng)建SqlSessionFactory對(duì)象。沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactoryBuilder,通常的做法是創(chuàng)建一個(gè)全局的對(duì)象就可以了。示例程序如下:

        private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
        private static SqlSessionFactory sqlSessionFactory;

        private static void init() throws IOException {
                String resource = "mybatis-config.xml";
                Reader reader = Resources.getResourceAsReader(resource);
                sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
                }
                org.apache.ibatis.session.Configuration 是mybatis初始化的核心。

        mybatis-config.xml中的配置,最后會(huì)解析xml成Configuration這個(gè)類。

        SqlSessionFactoryBuilder根據(jù)傳入的數(shù)據(jù)流(XML)生成Configuration對(duì)象,然后根據(jù)Configuration對(duì)象創(chuàng)建默認(rèn)的SqlSessionFactory實(shí)例。

        2、SqlSessionFactory對(duì)象由SqlSessionFactoryBuilder創(chuàng)建:

        它的主要功能是創(chuàng)建SqlSession對(duì)象,和SqlSessionFactoryBuilder對(duì)象一樣,沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactory,通常的做法是創(chuàng)建一個(gè)全局的對(duì)象就可以了。SqlSessionFactory對(duì)象一個(gè)必要的屬性是Configuration對(duì)象,它是保存Mybatis全局配置的一個(gè)配置對(duì)象,通常由SqlSessionFactoryBuilder從XML配置文件創(chuàng)建。這里給出一個(gè)簡(jiǎn)單的示例:

        <?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>
            <!-- 配置別名 -->
            <typeAliases>
                <typeAlias type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />
                <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />
            </typeAliases>

            <!-- 配置環(huán)境變量 -->
            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC" />
                    <dataSource type="POOLED">
                        <property name="driver" value="com.mysql.jdbc.Driver" />
                        <property name="url" value="jdbc:mysql://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />
                        <property name="username" value="iMybatis" />
                        <property name="password" value="iMybatis" />
                    </dataSource>
                </environment>
            </environments>

            <!-- 配置mappers -->
            <mappers>
                <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />
            </mappers>

        </configuration>

        3、SqlSession

        SqlSession對(duì)象的主要功能是完成一次數(shù)據(jù)庫的訪問和結(jié)果的映射,它類似于數(shù)據(jù)庫的session概念,由于不是線程安全的,所以SqlSession對(duì)象的作用域需限制方法內(nèi)。SqlSession的默認(rèn)實(shí)現(xiàn)類是DefaultSqlSession,它有兩個(gè)必須配置的屬性:Configuration和Executor。Configuration前文已經(jīng)描述這里不再多說。SqlSession對(duì)數(shù)據(jù)庫的操作都是通過Executor來完成的。

        SqlSession :默認(rèn)創(chuàng)建DefaultSqlSession 并且開啟一級(jí)緩存,創(chuàng)建執(zhí)行器 、賦值。

        SqlSession有一個(gè)重要的方法getMapper,顧名思義,這個(gè)方式是用來獲取Mapper對(duì)象的。什么是Mapper對(duì)象?根據(jù)Mybatis的官方手冊(cè),應(yīng)用程序除了要初始并啟動(dòng)Mybatis之外,還需要定義一些接口,接口里定義訪問數(shù)據(jù)庫的方法,存放接口的包路徑下需要放置同名的XML配置文件。

        SqlSession的getMapper方法是聯(lián)系應(yīng)用程序和Mybatis紐帶,應(yīng)用程序訪問getMapper時(shí),Mybatis會(huì)根據(jù)傳入的接口類型和對(duì)應(yīng)的XML配置文件生成一個(gè)代理對(duì)象,這個(gè)代理對(duì)象就叫Mapper對(duì)象。應(yīng)用程序獲得Mapper對(duì)象后,就應(yīng)該通過這個(gè)Mapper對(duì)象來訪問Mybatis的SqlSession對(duì)象,這樣就達(dá)到里插入到Mybatis流程的目的。

        SqlSession session= sqlSessionFactory.openSession();
                UserDao userDao = session.getMapper(UserDao.class);
                UserDto user = new UserDto();
                user.setUsername("iMybatis");
                List<UserDto> users = userDao.queryUsers(user);

            public interface UserDao {
            public List<UserDto> queryUsers(UserDto user) throws Exception;
                }

                <?xml version="1.0" encoding="UTF-8" ?>
                <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
                <mapper namespace="org.iMybatis.abc.dao.UserDao">
                    <select id="queryUsers" parameterType="UserDto" resultType="UserDto"
                            useCache="false">

                        <![CDATA[
                select * from t_user t where t.username = #{username}
                ]]>
                    </select>
                </mapper>

        4、Executor

        Executor對(duì)象在創(chuàng)建Configuration對(duì)象的時(shí)候創(chuàng)建,并且緩存在Configuration對(duì)象里。Executor對(duì)象的主要功能是調(diào)用StatementHandler訪問數(shù)據(jù)庫,并將查詢結(jié)果存入緩存中(如果配置了緩存的話)。

        5、StatementHandler

        StatementHandler是真正訪問數(shù)據(jù)庫的地方,并調(diào)用ResultSetHandler處理查詢結(jié)果。

        6、ResultSetHandler

        處理查詢結(jié)果。

        MyBatis成員層次&職責(zé)

        1. SqlSession 作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互的會(huì)話,完成必要數(shù)據(jù)庫增刪改查功能
        2. Executor MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)
        3. StatementHandler 封裝了JDBC Statement操作,負(fù)責(zé)對(duì)JDBCstatement的操作,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合。
        4. ParameterHandler 負(fù)責(zé)對(duì)用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù)
        5. ResultSetHandler *負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對(duì)象轉(zhuǎn)換成List類型的集合;
        6. TypeHandler 負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換
        7. MappedStatement MappedStatement維護(hù)了一條<select|update|delete|insert>節(jié)點(diǎn)的封
        8. SqlSource 負(fù)責(zé)根據(jù)用戶傳遞的parameterObject,動(dòng)態(tài)地生成SQL語句,將信息封裝到BoundSql對(duì)象中,并返回
        9. BoundSql 表示動(dòng)態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息
        10. Configuration MyBatis所有的配置信息都維持在Configuration對(duì)象之中

        title: Mybatis架構(gòu)與原理 date: 2021-05-23 tags: categories: 精進(jìn) permalink: Fight/Mybatis-architecture-and-principle author: 消失er from_url: jianshu.com/p/15781ec742f2 wechat_url:

        MyBatis功能架構(gòu)設(shè)計(jì)

        功能架構(gòu)講解:

        我們把Mybatis的功能架構(gòu)分為三層:

        (1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫。接口層一接收到調(diào)用請(qǐng)求就會(huì)調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。

        (2)數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請(qǐng)求完成一次數(shù)據(jù)庫操作。

        (3)基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

        框架架構(gòu)

        框架架構(gòu)講解:

        這張圖從上往下看。MyBatis的初始化,會(huì)從mybatis-config.xml配置文件,解析構(gòu)造成Configuration這個(gè)類,就是圖中的紅框。

        (1)加載配置:配置來源于兩個(gè)地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個(gè)個(gè)MappedStatement對(duì)象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲(chǔ)在內(nèi)存中。

        (2)SQL解析:當(dāng)API接口層接收到調(diào)用請(qǐng)求時(shí),會(huì)接收到傳入SQL的ID和傳入對(duì)象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會(huì)根據(jù)SQL的ID找到對(duì)應(yīng)的MappedStatement,然后根據(jù)傳入?yún)?shù)對(duì)象對(duì)MappedStatement進(jìn)行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù)。

        (3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進(jìn)行執(zhí)行,得到操作數(shù)據(jù)庫的結(jié)果。

        (4)結(jié)果映射:將操作數(shù)據(jù)庫的結(jié)果按照映射的配置進(jìn)行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結(jié)果返回。

        MyBatis核心類

        1、SqlSessionFactoryBuilder

        每一個(gè)MyBatis的應(yīng)用程序的入口是SqlSessionFactoryBuilder。

        它的作用是通過XML配置文件創(chuàng)建Configuration對(duì)象(當(dāng)然也可以在程序中自行創(chuàng)建),然后通過build方法創(chuàng)建SqlSessionFactory對(duì)象。沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactoryBuilder,通常的做法是創(chuàng)建一個(gè)全局的對(duì)象就可以了。示例程序如下:

        private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
        private static SqlSessionFactory sqlSessionFactory;

        private static void init() throws IOException {
                String resource = "mybatis-config.xml";
                Reader reader = Resources.getResourceAsReader(resource);
                sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
                }
                org.apache.ibatis.session.Configuration 是mybatis初始化的核心。

        mybatis-config.xml中的配置,最后會(huì)解析xml成Configuration這個(gè)類。

        SqlSessionFactoryBuilder根據(jù)傳入的數(shù)據(jù)流(XML)生成Configuration對(duì)象,然后根據(jù)Configuration對(duì)象創(chuàng)建默認(rèn)的SqlSessionFactory實(shí)例。

        2、SqlSessionFactory對(duì)象由SqlSessionFactoryBuilder創(chuàng)建:

        它的主要功能是創(chuàng)建SqlSession對(duì)象,和SqlSessionFactoryBuilder對(duì)象一樣,沒有必要每次訪問Mybatis就創(chuàng)建一次SqlSessionFactory,通常的做法是創(chuàng)建一個(gè)全局的對(duì)象就可以了。SqlSessionFactory對(duì)象一個(gè)必要的屬性是Configuration對(duì)象,它是保存Mybatis全局配置的一個(gè)配置對(duì)象,通常由SqlSessionFactoryBuilder從XML配置文件創(chuàng)建。這里給出一個(gè)簡(jiǎn)單的示例:

        <?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>
            <!-- 配置別名 -->
            <typeAliases>
                <typeAlias type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />
                <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />
            </typeAliases>

            <!-- 配置環(huán)境變量 -->
            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC" />
                    <dataSource type="POOLED">
                        <property name="driver" value="com.mysql.jdbc.Driver" />
                        <property name="url" value="jdbc:mysql://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />
                        <property name="username" value="iMybatis" />
                        <property name="password" value="iMybatis" />
                    </dataSource>
                </environment>
            </environments>

            <!-- 配置mappers -->
            <mappers>
                <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />
            </mappers>

        </configuration>

        3、SqlSession

        SqlSession對(duì)象的主要功能是完成一次數(shù)據(jù)庫的訪問和結(jié)果的映射,它類似于數(shù)據(jù)庫的session概念,由于不是線程安全的,所以SqlSession對(duì)象的作用域需限制方法內(nèi)。SqlSession的默認(rèn)實(shí)現(xiàn)類是DefaultSqlSession,它有兩個(gè)必須配置的屬性:Configuration和Executor。Configuration前文已經(jīng)描述這里不再多說。SqlSession對(duì)數(shù)據(jù)庫的操作都是通過Executor來完成的。

        SqlSession :默認(rèn)創(chuàng)建DefaultSqlSession 并且開啟一級(jí)緩存,創(chuàng)建執(zhí)行器 、賦值。

        SqlSession有一個(gè)重要的方法getMapper,顧名思義,這個(gè)方式是用來獲取Mapper對(duì)象的。什么是Mapper對(duì)象?根據(jù)Mybatis的官方手冊(cè),應(yīng)用程序除了要初始并啟動(dòng)Mybatis之外,還需要定義一些接口,接口里定義訪問數(shù)據(jù)庫的方法,存放接口的包路徑下需要放置同名的XML配置文件。

        SqlSession的getMapper方法是聯(lián)系應(yīng)用程序和Mybatis紐帶,應(yīng)用程序訪問getMapper時(shí),Mybatis會(huì)根據(jù)傳入的接口類型和對(duì)應(yīng)的XML配置文件生成一個(gè)代理對(duì)象,這個(gè)代理對(duì)象就叫Mapper對(duì)象。應(yīng)用程序獲得Mapper對(duì)象后,就應(yīng)該通過這個(gè)Mapper對(duì)象來訪問Mybatis的SqlSession對(duì)象,這樣就達(dá)到里插入到Mybatis流程的目的。

        SqlSession session= sqlSessionFactory.openSession();
                UserDao userDao = session.getMapper(UserDao.class);
                UserDto user = new UserDto();
                user.setUsername("iMybatis");
                List<UserDto> users = userDao.queryUsers(user);

            public interface UserDao {
            public List<UserDto> queryUsers(UserDto user) throws Exception;
                }

                <?xml version="1.0" encoding="UTF-8" ?>
                <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
                <mapper namespace="org.iMybatis.abc.dao.UserDao">
                    <select id="queryUsers" parameterType="UserDto" resultType="UserDto"
                            useCache="false">

                        <![CDATA[
                select * from t_user t where t.username = #{username}
                ]]>
                    </select>
                </mapper>

        4、Executor

        Executor對(duì)象在創(chuàng)建Configuration對(duì)象的時(shí)候創(chuàng)建,并且緩存在Configuration對(duì)象里。Executor對(duì)象的主要功能是調(diào)用StatementHandler訪問數(shù)據(jù)庫,并將查詢結(jié)果存入緩存中(如果配置了緩存的話)。

        5、StatementHandler

        StatementHandler是真正訪問數(shù)據(jù)庫的地方,并調(diào)用ResultSetHandler處理查詢結(jié)果。

        6、ResultSetHandler

        處理查詢結(jié)果。

        MyBatis成員層次&職責(zé)

        1. SqlSession 作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互的會(huì)話,完成必要數(shù)據(jù)庫增刪改查功能
        2. Executor MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)
        3. StatementHandler 封裝了JDBC Statement操作,負(fù)責(zé)對(duì)JDBCstatement的操作,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合。
        4. ParameterHandler 負(fù)責(zé)對(duì)用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù)
        5. ResultSetHandler *負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對(duì)象轉(zhuǎn)換成List類型的集合;
        6. TypeHandler 負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換
        7. MappedStatement MappedStatement維護(hù)了一條<select|update|delete|insert>節(jié)點(diǎn)的封
        8. SqlSource 負(fù)責(zé)根據(jù)用戶傳遞的parameterObject,動(dòng)態(tài)地生成SQL語句,將信息封裝到BoundSql對(duì)象中,并返回
        9. BoundSql 表示動(dòng)態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息
        10. Configuration MyBatis所有的配置信息都維持在Configuration對(duì)象之中



        歡迎添加程序汪個(gè)人微信 itwang007  進(jìn)粉絲群或圍觀朋友圈



        往期資源  需要請(qǐng)自取

        Java項(xiàng)目分享 最新整理全集,找項(xiàng)目不累啦 03版

        臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開放下載!

        字節(jié)跳動(dòng)總結(jié)的設(shè)計(jì)模式 PDF 火了,完整版開放下載!


        堪稱神級(jí)的Spring Boot手冊(cè),從基礎(chǔ)入門到實(shí)戰(zhàn)進(jìn)階


        臥槽!阿里大佬總結(jié)的《圖解Java》火了,完整版PDF開放下載!

        喜歡就"在看"唄^_^

        瀏覽 68
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91九色蝌蚪91POR成人| 国产成人免费在线观看| 簧片网站在线观看| 欧美日韩高清一区二区三区| 久久精品免费电影| 日韩无码AV中文字幕| 操美女91| 亚洲jizzjizz| 日本乱码视频| 无码成人视频| 色多多毛片| 丁香五月在线| 五月网| 成人无码区免费AV毛片| 成人丁香五月| 你懂得视频在线观看| 日韩V欧美| 成人做爱免费看| footjobvk| 亚洲欧美在线观看| 91超碰人人操| 日本久久精品18| A级免费毛片| AV福利在线观看| 99久久精品国产一区二区三区| 久色亚洲| 美日韩AV| 成人先锋影音| 一级特黄毛片| 无码国产+白浆| 男女啪啪啪网站| 久久视频99| 91av在线观看视频| 九九热99视频| 中文字幕一二三四| 91大神在线免费观看| 91ThePorn国产| 午夜福利AV电影| 欧美国产日韩视频| 日本一区二区精品| 亚洲在线无码播放| 天天日天天干天天爽| 国产精品色综合| 91探花视频在线观看| 日本三级片视频不卡| 日本中文字幕视频| 久久久久一| 国产一级在线观看| 国产精品国产三级国产AⅤ| aaa无码| 久久悠悠| 91丨露脸丨熟女精品| 视色网站| 亚洲日韩一区二区三区| 久草热在线| 日逼免费视频| 刘玥91精一区二区三区| 美女黄色视频网站| 欧美一级片在线| 欧美精品在线视频| 久久成人精品视频| 国产在线成人| 黄片一区二区| 逼特逼在线观看| www.啪啪| 亚洲777| 三级乱伦86丝袜无码| 亚洲AVwww| 日韩欧美亚洲| h片免费在线观看| 性爱视频免费网站| 国产欧美自拍| 亚洲在线视频观看| 日韩中文字幕熟妇人妻| 中文无码字幕| 韩国深夜福利视频| 午夜国产精品AV| 无码人妻丰满熟妇精品区| 人人爱人人爽人人操| 天天插综合| 精品无人区无码乱码毛片国产| 成人大香蕉网站精品免费| 夜夜操天天操| 久久熟女嫩草成人片免费| 在线观看亚洲专区| 国产精品蜜| av手机版| 久久99精品久久久水蜜桃| 加勒比无码高清| 亚洲v在线| 蜜臀久久99精品久久久久久酒店| 99热1| 三级片韩国AV| 日本一区二区网站| 先锋影音亚洲无码av| 91av导航| 网站啪啪| 无码一区二区三区免费| 欧美日韩亚洲另类| 天堂无码高清| 亚洲天堂在线视频播放| 在线观看视频国产| 91福利视频在线观看| 久操视频网站| 国产精品一区在线| 欧美日在线| 成人视频免费在线观看| 香蕉黄色三级片| 国产精品特级毛片| aaa国产精品| A片黄色视频| 日韩成人一级片| 激情人妻AV| 亚洲熟女视频| 高清无码视频在线播放| 黄色精品| 精品无套| 免费无码一区二区三区四区五区| 国产精品免费久久| 国产91探花精品一区二区| 操逼操逼逼| 亚洲无码人妻| 免费AV大全| 91久久欧美极品XXXXⅩ| 成人国产精品秘在线看| 444444免费高清在线观看电视剧的注意| 操B视频在线| 日韩精品极品视频在线观看免费 | 欧美成人精品一级| 蜜桃久久精品成人无码AV| 日韩在线观看中文字幕| 亚洲日产专区| 无码操逼视频| 无码AV网站| 国产亚洲AV| 福利黄色片:片| 超碰97成人| 高潮喷水视频| 国产三级AV在线| 97成人人妻一区二区三区| 在线黄色网| AV天堂影视在线观看| AV超碰| 亚洲AV女人18毛片水真多| 免费国产黄色视频| 久久久久久久久国产精品| 夜夜草视频| 肏逼网站| 4080yy午夜理论片成人| 一级a毛片| 午夜日逼网站| 蜜臀精品一区二区三区| 嫩BBB搡BBB槡BBB小号| 亚洲色图偷拍| 亚洲免费观看高清视频| 中文字幕东京热| 色天天干| 日本伊人大香蕉| 日韩av电影在线观看| 中文字幕激情精品| 91美女操逼视频| AV天堂中文字幕| 久久国产精品一区二区三区| 亚洲天堂综合网| 五月丁香网站| 亚洲AAAAAA| 人人摸人人看人人| 国产成人AV免费无码| 日本精品无码a62v在线| 国产操片| 国产精品乱码毛片在线人与 | 调教人妻视频| 亚洲欧洲高清无码| 免费视频久久| 大香蕉啪啪啪| 不卡无码免费| 在线h网站| 亚洲无码AV在线播放| 女孩自慰在线观看| 精品一区电影| www.日韩精品| 麻豆精品久久久久久久99蜜桃| 亚洲一区色| 影音先锋女人av噜噜色| 无码高清在线播放| 站街大龄熟女x| 国产AV无遮挡| 无码中文字幕在线播放| 国产免看一级a一片成人aⅴ| 麻豆传媒电影| 国产熟女一区二区久久| 国产女人18水真多18精品一级做 | 久久久久久毛片| 日本欧美成人片AAAA| 色逼综合| 国产成人97精品免费看片| 肏逼视频网站| 中文字幕一区三区人妻视频| 国内成人AV| 人妻懂色av粉嫩av浪潮av| 黄页网站在线免费观看| 国产综合久久久777777色胡同| av在线无码| 久久国产免费视频| 影视先锋成人在线| 三级自拍| 色色成人网| 蜜桃久久久亚洲精| 亚洲综合视频网| 91精品婷婷国产综合久久| 免费无码成人片在线观看在线| 蜜臀99| 国内精品久久久久久久久久变脸| 无码偷拍| 亚洲激情综合| 久久中文字幕无码| 日韩AV高清无码| 人人妻人人操人人| 国产曰韩欧美综合另类在线 | 青青草无码视频| 麻豆成人无码| 另类视频在线| 97在线观看免费视频| 久久6| AV大片免费看| 久久精品苍井空免费一区二| 亚洲精品乱码| 国产精品久久久久国产A级| 免费一级AAAAA片在线播放| 国产乱妇乱子伦视频免费观看让女人| 91成人视频在线观看| 噜噜| 国产成人精品麻豆| 青青草视频在线免费观看| 蜜桃导航-精品导航| 偷拍久久久| 免费在线观看a| 西西掰穴| 狠狠2021| 大荫蒂hd大荫蒂视频| 日韩无码不卡| 午夜久久福利| 欧美另类色| 91视频观看| 伊人免费视频在线观看| 日本中文字幕免费| 操逼天堂| 91国产视频网站| 欧美性爱视频免费观看| 日韩综合精品中文字幕66| 午夜影院操| 超碰日逼| 午夜综合| 在线成人小视频| 国产主播第一页| 99热自拍| 色吟av| 夜夜福利| 色五月综合| av大片在线观看| 国产粉嫩在线观看| 搡BBBB搡BBB搡我瞎了| 亚洲成人a片| 人人摸人人操人人干| 精品国产三级| 亚洲高清无码在线观看视频| 国产高清无码在线观看视频| 亚洲一区中文字幕| 国产1024在线| 伊人色播| 在线小视频| 91人妻人澡| 91人妻人人澡人人爽人人精| 日韩无码免费| 你懂得视频| 国产一级a一级a免费视频| 免费中文字幕视频| 一级黄色性爱视频| 三级黄视频| 小黃片秘嗯嗯啊| 久草资源在线观看| 三级片在线视频| 超碰v| 99毛片| 三洞齐开Av在线免费观看| 一级A片黄色| 丰满少妇在线观看网站| 人人妻人人操人人爱| 中文字幕在线观看二区| 欧美色交| 亚洲成人无码高清| 热99视频| 国产高清无码片| 91人妻日韩人妻无码| 欧美成人色图| 国产成人精品国内自产拍免费看 | 欧美日韩免费视频| 国产一区二区三区视频| 一区二区三区在线视频观看| 91精品国产偷窥一区二区|