国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

Mybatis的介紹、基本使用、高級使用

 更新時(shí)間:2023年03月27日 15:12:54   作者:麥芽糖0219  
這篇文章主要介紹了Mybatis的介紹、基本使用、高級使用,Mybatis是一款半自動的ORM持久層框架,具有較高的SQL靈活性,如何使用看這篇就夠了,需要的朋友可以參考下

一 數(shù)據(jù)庫操作框架的歷程

1.1 JDBC

JDBC(Java Data Base Connection,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成.JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序

  • 優(yōu)點(diǎn):運(yùn)行期:快捷、高效
  • 缺點(diǎn):編輯期:代碼量大、繁瑣異常處理、不支持?jǐn)?shù)據(jù)庫跨平臺

在這里插入圖片描述

jdbc核心api

  1. DriverManager 連接數(shù)據(jù)庫
  2. Connection 連接數(shù)據(jù)庫的抽象
  3. Statment 執(zhí)行SQL
  4. ResultSet 數(shù)據(jù)結(jié)果集

1.2 DBUtils

DBUtils是Java編程中的數(shù)據(jù)庫操作實(shí)用工具,小巧簡單實(shí)用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼。
DBUtils三個(gè)核心功能介紹

  1. QueryRunner中提供對sql語句操作的API
  2. ResultSetHandler接口,用于定義select操作后,怎樣封裝結(jié)果集
  3. DBUtils類,它就是一個(gè)工具類,定義了關(guān)閉資源與事務(wù)處理的方法

1.3 Hibernate

ORM 對象關(guān)系映射

  1. object java對象
  2. relational 關(guān)系型數(shù)據(jù)
  3. mapping 映射
  • Hibernate 是由 Gavin King 于 2001 年創(chuàng)建的開放源代碼的對象關(guān)系框架。它強(qiáng)大且高效的構(gòu)建具有關(guān)系對象持久性和查詢服務(wù)的 Java 應(yīng)用程序。
  • Hibernate 將 Java 類映射到數(shù)據(jù)庫表中,從 Java 數(shù)據(jù)類型中映射到 SQL 數(shù)據(jù)類型中,并把開發(fā)人員從 95% 的公共數(shù)據(jù)持續(xù)性編程工作中解放出來。
  • Hibernate 是傳統(tǒng) Java 對象和數(shù)據(jù)庫服務(wù)器之間的橋梁,用來處理基于 O/R 映射機(jī)制和模式的那些對象。

在這里插入圖片描述

Hibernate 優(yōu)勢

  • Hibernate 使用 XML 文件來處理映射 Java 類別到數(shù)據(jù)庫表格中,并且不用編寫任何代碼。
  • 為在數(shù)據(jù)庫中直接儲存和檢索 Java 對象提供簡單的 APIs。
  • 如果在數(shù)據(jù)庫中或任何其它表格中出現(xiàn)變化,那么僅需要改變 XML 文件屬性。
  • 抽象不熟悉的 SQL 類型,并為我們提供工作中所熟悉的 Java 對象。
  • Hibernate 不需要應(yīng)用程序服務(wù)器來操作。
  • 操控你數(shù)據(jù)庫中對象復(fù)雜的關(guān)聯(lián)。
  • 最小化與訪問數(shù)據(jù)庫的智能提取策略。
  • 提供簡單的數(shù)據(jù)詢問。

Hibernate劣勢

  • hibernate的完全封裝導(dǎo)致無法使用數(shù)據(jù)的一些功能。
  • Hibernate的緩存問題。
  • Hibernate對于代碼的耦合度太高。
  • Hibernate尋找bug困難。
  • Hibernate批量數(shù)據(jù)操作需要大量的內(nèi)存空間而且執(zhí)行過程中需要的對象太多

1.4 JDBCTemplate

JdbcTemplate針對數(shù)據(jù)查詢提供了多個(gè)重載的模板方法,你可以根據(jù)需要選用不同的模板方法.如果你的查詢很簡單,僅僅是傳入相應(yīng)SQL或者相關(guān)參數(shù),然后取得一個(gè)單一的結(jié)果,那么你可以選擇如下一組便利的模板方法。

  • 優(yōu)點(diǎn):運(yùn)行期:高效、內(nèi)嵌Spring框架中、支持基于AOP的聲明式事務(wù)
  • 缺點(diǎn):必須于Spring框架結(jié)合在一起使用、不支持?jǐn)?shù)據(jù)庫跨平臺、默認(rèn)沒有緩存

1.5 Mybatis

MyBatis 是一款優(yōu)秀的持久層框架/半自動的ORM,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。

優(yōu)點(diǎn)
1、與JDBC相比,減少了50%的代碼量
2、 最簡單的持久化框架,簡單易學(xué)
3、SQL代碼從程序代碼中徹底分離出來,可以重用
4、提供XML標(biāo)簽,支持編寫動態(tài)SQL
5、提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的ORM字段關(guān)系映射
6、支持緩存、連接池、數(shù)據(jù)庫移植…

缺點(diǎn)
1、SQL語句編寫工作量大,熟練度要高
2、數(shù)據(jù)庫移植性比較差,如果需要切換數(shù)據(jù)庫的話,SQL語句會有很大的差異

二 MyBatis的配置文件詳解

2.1 MyBatis日志配置

導(dǎo)入pom

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>

 <dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>1.2.3</version>
 </dependency>

添加logback配置文件

<configuration>
    <!--appender 追加器   日志以哪種方式進(jìn)行輸出
            name 取個(gè)名字
            class 不同實(shí)現(xiàn)類會輸出到不同地方
                ch.qos.logback.core.ConsoleAppender 輸出到控制臺
    -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 格式 -->
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{100} - %msg%n</pattern>
        </encoder>
    </appender>
<!--cn.tulingxueyuan.mapper-->
<!--控制跟細(xì)粒度的日志級別  根據(jù)包\根據(jù)類-->
    <logger name="cn.tulingxueyuan.mapper" level="debug"></logger>
    org.apache.ibatis.transaction
    <!--控制所有的日志級別-->
    <root level="error">
        <!-- 將當(dāng)前日志級別輸出到哪個(gè)追加器上面 -->
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
Logger LOGGER= LoggerFactory.getLogger(this.getClass());
/**
 * 日志級別
 * TRACE < DEBUG < INFO < WARN < ERROR。
 * 1        2       3      4       5
 */
@Test
public  void test02(){
    LOGGER.trace("跟蹤級別");
    LOGGER.debug("調(diào)試級別");
    LOGGER.info("信息級別");
    LOGGER.warn("警告級別");
    LOGGER.error("異常級別");
}

2.2 mybatis-config.xml全局配置文件詳解

在mybatis的項(xiàng)目中,我們發(fā)現(xiàn)了有一個(gè)mybatis-config.xml的配置文件,這個(gè)配置文件是mybatis的全局配置文件,用來進(jìn)行相關(guān)的全局配置,在任何操作下都生效的配置。下面我們要針對其中的屬性做詳細(xì)的解釋,方便大家在后續(xù)使用的時(shí)候更加熟練。

官方說明:
MyBatis 的配置文件包含了會深深影響 MyBatis 行為的設(shè)置和屬性信息。 配置文檔的頂層結(jié)構(gòu)如下:

mybatis-config.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>
    <!--引入外部配置文件,類似于Spring中的property-placeholder
    resource:從類路徑引入
    url:從磁盤路徑或者網(wǎng)絡(luò)路徑引入
    -->
    <properties resource="db.properties"></properties>
    <!--用來控制mybatis運(yùn)行時(shí)的行為,是mybatis中的重要配置-->
    <settings>
        <!--設(shè)置列名映射的時(shí)候是否是駝峰標(biāo)識-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--typeAliases表示為我們引用的實(shí)體類起別名,默認(rèn)情況下我們需要寫類的完全限定名
    如果在此處做了配置,那么可以直接寫類的名稱,在type中配置上類的完全限定名,在使用的時(shí)候可以忽略大小寫
    還可以通過alias屬性來表示類的別名
    -->
    <typeAliases>
<!--        <typeAlias type="cn.tulingxueyuan.bean.Emp" alias="Emp"></typeAlias>-->
        <!--如果需要引用多個(gè)類,那么給每一個(gè)類起別名肯定會很麻煩,因此可以指定對應(yīng)的包名,那么默認(rèn)用的是類名-->
        <package name="cn.tulingxueyuan.bean"/>
    </typeAliases>
    <!--
    在實(shí)際的開發(fā)過程中,我們可能分為開發(fā)環(huán)境,生產(chǎn)環(huán)境,測試環(huán)境等等,每個(gè)環(huán)境的配置可以是不一樣的
    environment就用來表示不同環(huán)境的細(xì)節(jié)配置,每一個(gè)環(huán)境中都需要一個(gè)事務(wù)管理器以及數(shù)據(jù)源的配置
    我們在后續(xù)的項(xiàng)目開發(fā)中幾乎都是使用spring中配置的數(shù)據(jù)源和事務(wù)管理器來配置,此處不需要研究
    -->
    <!--default:用來選擇需要的環(huán)境-->
    <environments default="development">
        <!--id:表示不同環(huán)境的名稱-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置數(shù)據(jù)庫連接-->
            <dataSource type="POOLED">
                <!--使用${}來引入外部變量-->
                <property name="driver" value="${driverClassname}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--
    在不同的數(shù)據(jù)庫中,可能sql語句的寫法是不一樣的,為了增強(qiáng)移植性,可以提供不同數(shù)據(jù)庫的操作實(shí)現(xiàn)
    在編寫不同的sql語句的時(shí)候,可以指定databaseId屬性來標(biāo)識當(dāng)前sql語句可以運(yùn)行在哪個(gè)數(shù)據(jù)庫中
    -->
    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="SQL Server" value="sqlserver"/>
        <property name="Oracle" value="orcl"/>
    </databaseIdProvider>
    
    <!--將sql的映射文件適用mappers進(jìn)行映射-->
    <mappers>
        <!--
        指定具體的不同的配置文件
        class:直接引入接口的全類名,可以將xml文件放在dao的同級目錄下,并且設(shè)置相同的文件名稱,同時(shí)可以使用注解的方式來進(jìn)行相關(guān)的配置
        url:可以從磁盤或者網(wǎng)絡(luò)路徑查找sql映射文件
        resource:在類路徑下尋找sql映射文件
        -->
<!--        <mapper resource="EmpDao.xml"/>
        <mapper resource="UserDao.xml"/>
        <mapper class="cn.tulingxueyuan.dao.EmpDaoAnnotation"></mapper>-->
        <!--
        當(dāng)包含多個(gè)配置文件或者配置類的時(shí)候,可以使用批量注冊的功能,也就是引入對應(yīng)的包,而不是具體的配置文件或者類
        但是需要注意的是,
        1、如果使用的配置文件的形式,必須要將配置文件跟dao類放在一起,這樣才能找到對應(yīng)的配置文件.
            如果是maven的項(xiàng)目的話,還需要添加以下配置,原因是maven在編譯的文件的時(shí)候只會編譯java文件
                <build>
                    <resources>
                        <resource>
                            <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.xml</include>
                        </includes>
                    </resource>
                    </resources>
                </build>

        2、將配置文件在resources資源路徑下創(chuàng)建跟dao相同的包名
        -->
        <package name="cn.tulingxueyuan.dao"/>
    </mappers>
</configuration>

2.3 Mybatis SQL映射文件詳解

MyBatis 的真正強(qiáng)大在于它的語句映射,這是它的魔力所在。由于它的異常強(qiáng)大,映射器的 XML 文件就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 代碼進(jìn)行對比,你會立即發(fā)現(xiàn)省掉了將近 95% 的代碼。MyBatis 致力于減少使用成本,讓用戶能更專注于 SQL 代碼。
SQL 映射文件只有很少的幾個(gè)頂級元素(按照應(yīng)被定義的順序列出):

  • cache – 該命名空間的緩存配置。
  • cache-ref – 引用其它命名空間的緩存配置。
  • resultMap – 描述如何從數(shù)據(jù)庫結(jié)果集中加載對象,是最復(fù)雜也是最強(qiáng)大的元素。
  • parameterMap – 老式風(fēng)格的參數(shù)映射。此元素已被廢棄,并可能在將來被移除!請使用行內(nèi)參數(shù)映射。文檔中不會介紹此元素。
  • sql – 可被其它語句引用的可重用語句塊。
  • insert – 映射插入語句。
  • update – 映射更新語句。
  • delete – 映射刪除語句。
  • select – 映射查詢語句。

在每個(gè)頂級元素標(biāo)簽中可以添加很多個(gè)屬性,下面我們開始詳細(xì)了解下具體的配置。

insert、update、delete元素

屬性描述
id在命名空間中唯一的標(biāo)識符,可以被用來引用這條語句。
parameterType將會傳入這條語句的參數(shù)的類全限定名或別名。這個(gè)屬性是可選的,因?yàn)?MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數(shù),默認(rèn)值為未設(shè)置(unset)。
parameterMap用于引用外部 parameterMap 的屬性,目前已被廢棄。請使用行內(nèi)參數(shù)映射和 parameterType 屬性。
flushCache將其設(shè)置為 true 后,只要語句被調(diào)用,都會導(dǎo)致本地緩存和二級緩存被清空,默認(rèn)值:(對 insert、update 和 delete 語句)true。
timeout這個(gè)設(shè)置是在拋出異常之前,驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認(rèn)值為未設(shè)置(unset)(依賴數(shù)據(jù)庫驅(qū)動)。
statementType可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認(rèn)值:PREPARED。
useGeneratedKeys(僅適用于 insert 和 update)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的自動遞增字段),默認(rèn)值:false。
keyProperty(僅適用于 insert 和 update)指定能夠唯一識別對象的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設(shè)置它的值,默認(rèn)值:未設(shè)置(unset)。如果生成列不止一個(gè),可以用逗號分隔多個(gè)屬性名稱。
keyColumn(僅適用于 insert 和 update)設(shè)置生成鍵值在表中的列名,在某些數(shù)據(jù)庫(像 PostgreSQL)中,當(dāng)主鍵列不是表中的第一列的時(shí)候,是必須設(shè)置的。如果生成列不止一個(gè),可以用逗號分隔多個(gè)屬性名稱。
databaseId如果配置了數(shù)據(jù)庫廠商標(biāo)識(databaseIdProvider),MyBatis 會加載所有不帶 databaseId 或匹配當(dāng)前 databaseId 的語句;如果帶和不帶的語句都有,則不帶的會被忽略。
 <!--如果數(shù)據(jù)庫支持自增可以使用這樣的方式-->
 <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    insert into user(user_name) values(#{userName})
 </insert>
 <!--如果數(shù)據(jù)庫不支持自增的話,那么可以使用如下的方式進(jìn)行賦值查詢-->
 <insert id="insertUser2" >
     <selectKey order="BEFORE" keyProperty="id" resultType="integer">
        select max(id)+1 from user
     </selectKey>
    insert into user(id,user_name) values(#{id},#{userName})
 </insert>

更多詳細(xì)內(nèi)容見下邊的第三章節(jié)

三 MyBatis基于XML的詳細(xì)使用-參數(shù)、返回結(jié)果處理

3.1 參數(shù)的取值方式

在xml文件中編寫sql語句的時(shí)候有兩種取值的方式,分別是#{}和${},下面來看一下他們之間的區(qū)別:

<!--獲取參數(shù)的方式:
    1.#{} ==> jdbc String sql=" SELECT id,user_name FROM EMP WHERE id=?"
        1.會經(jīng)過JDBC當(dāng)中PreparedStatement的預(yù)編譯,會根據(jù)不同的數(shù)據(jù)類型來編譯成對應(yīng)數(shù)據(jù)庫所對應(yīng)的數(shù)據(jù)。
        2.能夠有效的防止SQL注入。 推薦使用??!
        特殊用法:
        自帶很多內(nèi)置參數(shù)的屬性:通常不會使用。了解
        javaType、jdbcType、mode、numericScale、resultMap、typeHandler.
        比如 需要改變默認(rèn)的NULL===>OTHER:#{id,javaType=NULL}
             想保留小數(shù)點(diǎn)后兩位:#{id,numericScale=2}

    2.${} ==> jdbc String sql=" SELECT id,user_name FROM EMP WHERE id="+id
        1.不會進(jìn)行預(yù)編譯,會直接將輸入進(jìn)來的數(shù)據(jù)拼接在SQL中。
        2.存在SQL注入的風(fēng)險(xiǎn)。不推薦使用。
        特殊用法:
            1.調(diào)試情況下可以臨時(shí)使用。
            2.實(shí)現(xiàn)一些特殊功能:前提一定要保證數(shù)據(jù)的安全性。
             比如:動態(tài)表、動態(tài)列. 動態(tài)SQL.
-->
<select id="SelectEmp"  resultType="Emp"  resultMap="emp_map"  >
    SELECT id,user_name,create_date FROM EMP where id=#{id}
</select>

3.2 select的參數(shù)傳遞

<!--
   參數(shù)傳遞的處理:
   1.單個(gè)參數(shù):SelectEmp(Integer id);
       mybatis 不會做任何特殊要求
       獲取方式:
           #:{輸入任何字符獲取參數(shù)}

   2.多個(gè)參數(shù):Emp SelectEmp(Integer id,String username);
       mybatis 會進(jìn)行封裝
       會將傳進(jìn)來的參數(shù)封裝成map:
       1個(gè)值就會對應(yīng)2個(gè)map項(xiàng) :  id===>  {key:arg0 ,value:id的值},{key:param1 ,value:id的值}
                                 username===>  {key:arg1 ,value:id的值},{key:param2 ,value:id的值}
       獲取方式:
            沒使用了@Param:
                      id=====>  #{arg0} 或者 #{param1}
                username=====>  #{arg1} 或者 #{param2}
            除了使用這種方式還有別的方式,因?yàn)檫@種方式參數(shù)名沒有意義:
            設(shè)置參數(shù)的別名:@Param(""):SelectEmp(@Param("id") Integer id,@Param("username") String username);
            當(dāng)使用了@Param:
                      id=====>  #{id} 或者 #{param1}
                username=====>  #{username} 或者 #{param2}

    3. javaBean的參數(shù):
       單個(gè)參數(shù):Emp SelectEmp(Emp emp);
       獲取方式:可以直接使用屬性名
           emp.id=====>#{id}
           emp.username=====>#{username}
       多個(gè)參數(shù):Emp SelectEmp(Integer num,Emp emp);
           num===>    #{param1} 或者 @Param
           emp===> 必須加上對象別名: emp.id===> #{param2.id} 或者  @Param("emp")Emp emp    ====>#{emp.id}
                                   emp.username===> #{param2.username} 或者  @Param("emp")Emp emp    ====>#{emp.username}
    4.集合或者數(shù)組參數(shù):
           Emp SelectEmp(List<String> usernames);
       如果是list,MyBatis會自動封裝為map:
           {key:"list":value:usernames}
             沒用@Param("")要獲得:usernames.get(0)  =====>  #{list[0]}
                                 :usernames.get(0)  =====>  #{agr0[0]}
             有@Param("usernames")要獲得:usernames.get(0)  =====>  #{usernames[0]}
                                        :usernames.get(0)  =====>  #{param1[0]}
       如果是數(shù)組,MyBatis會自動封裝為map:
           {key:"array":value:usernames}
             沒用@Param("")要獲得:usernames.get(0)  =====>  #{array[0]}
                               :usernames.get(0)  =====>  #{agr0[0]}
             有@Param("usernames")要獲得:usernames.get(0)  =====>  #{usernames[0]}
                                        :usernames.get(0)  =====>  #{param1[0]}
     5.map參數(shù)
       和javaBean的參數(shù)傳遞是一樣。
       一般情況下:
           請求進(jìn)來的參數(shù) 和pojo對應(yīng),就用pojo
           請求進(jìn)來的參數(shù) 沒有和pojo對應(yīng),就用map
           請求進(jìn)來的參數(shù) 沒有和pojo對應(yīng)上,但是使用頻率很高,就用TO、DTO(就是單獨(dú)為這些參數(shù)創(chuàng)建一個(gè)對應(yīng)的javaBean出來,使參數(shù)傳遞更規(guī)范、更重用)

   --> 

   <!--
   接口:SelectEmp(String username,@Param("id") Integer id);
          username====>  #{arg0}  #{param1}
          id====>  #{id}  #{param2}
   接口:SelectEmp(@Param("beginDate") String beginDate,
                    String endDate,
                   Emp emp);
          beginDate====>  #{beginDate}  #{param1}
          endDate====>  #{arg1}  #{param2}
          emp.id====>#{arg2.id}  #{param2.id}
   接口:SelectEmp(List<Integer> ids,
                  String[] usernames,
                  @Param("beginDate") String beginDate,
                    String endDate,);
               ids.get(0)=====> #{list[0]}      #{param1[0]}
               usernames[0]=====> #{array[0]}      #{param2[0]}
          beginDate====>  #{beginDate}  #{param3}
          end====>  #{arg3}  #{param4}
   -->

3.3 處理集合返回結(jié)果

EmpDao.xml

<!--當(dāng)返回值的結(jié)果是集合的時(shí)候,返回值的類型依然寫的是集合中具體的類型-->
    <select id="selectAllEmp" resultType="cn.tulingxueyuan.bean.Emp">
        select  * from emp
    </select>
<!--在查詢的時(shí)候可以設(shè)置返回值的類型為map,當(dāng)mybatis查詢完成之后會把列的名稱作為key
    列的值作為value,轉(zhuǎn)換到map中
    -->
    <select id="selectEmpByEmpReturnMap" resultType="map">
        select * from emp where empno = #{empno}
    </select>

    <!--注意,當(dāng)返回的結(jié)果是一個(gè)集合對象的時(shí)候,返回值的類型一定要寫集合具體value的類型,
    同時(shí)在dao的方法上要添加@MapKey的注解,來設(shè)置key是什么結(jié)果
    @MapKey("empno")
    Map<Integer,Emp> getAllEmpReturnMap();-->
    <select id="getAllEmpReturnMap" resultType="cn.tulingxueyuan.bean.Emp">
        select * from emp
    </select>

3.4 自定義結(jié)果集—resultMap

<!--1.聲明resultMap自定義結(jié)果集   resultType 和 resultMap 只能使用一個(gè)。
    id 唯一標(biāo)識, 需要和<select 上的resultMap 進(jìn)行對應(yīng)
    type 需要映射的pojo對象, 可以設(shè)置別名
    autoMapping 自動映射,(默認(rèn)=true) 只要字段名和屬性名遵循映射規(guī)則就可以自動映射,但是不建議,哪怕屬性名和字段名一一對應(yīng)上了也要顯示的配置映射
    extends  如果多個(gè)resultMap有重復(fù)映射,可以聲明父resultMap,將公共的映射提取出來, 可以減少子resultMap的映射冗余
-->
<resultMap id="emp_map" type="emp" autoMapping="false" extends="common_map">
    <result column="create_date" property="cjsj"></result>
</resultMap>

<resultMap id="common_map" type="emp" autoMapping="false" >
    <!-- <id> 主鍵必須使用  對底層存儲有性能作用
                 column  需要映射的數(shù)據(jù)庫字段名
                 property 需要映射的pojo屬性名
     -->
    <id column="id" property="id"></id>
    <result column="user_name" property="username"></result>
</resultMap>

<!--2.使用resultMap 關(guān)聯(lián) 自定義結(jié)果集的id-->
<select id="SelectEmp"  resultType="Emp"  resultMap="emp_map"  >
    SELECT id,user_name,create_date FROM EMP where id=#{id}
</select>

四 MyBatis基于XML的詳細(xì)使用——高級結(jié)果映射

4.1 聯(lián)合查詢

emp.java

import java.time.LocalDate;

public class Emp {
    private Integer id;
    private String username;
    private LocalDate createDate;
    private deptId deptId;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public LocalDate getCreateDate() {
        return createDate;
    }

    public void setCreateDate(LocalDate createDate) {
        this.createDate = createDate;
    }

    public Integer getDeptId() {
        return dept;
    }

    public void setDeptId(Integer deptId) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", createDate=" + createDate +
                ", deptId=" + deptId+
                '}';
    }
}

EmpMapper.xml

<!-- 實(shí)現(xiàn)表聯(lián)結(jié)查詢的方式:  可以映射: DTO -->
<resultMap id="QueryEmp_Map" type="QueryEmpDTO">
    <id column="e_id" property="id"></id>
    <result column="user_name" property="username"></result>
    <result column="d_id" property="deptId"></result>
    <result column="dept_name" property="deptName"></result>
</resultMap>

<select id="QueryEmp"  resultMap="QueryEmp_Map">
    select t1.id as e_id,t1.user_name,t2.id as d_id,t2.dept_name from emp t1
    INNER JOIN dept t2 on t1.dept_id=t2.id
    where t1.id=#{id}
</select>

<!-- 實(shí)現(xiàn)表聯(lián)結(jié)查詢的方式:  可以映射map -->
<resultMap id="QueryEmp_Map" type="map">
    <id column="e_id" property="id"></id>
    <result column="user_name" property="username"></result>
    <result column="d_id" property="deptId"></result>
    <result column="dept_name" property="deptName"></result>
</resultMap>

<select id="QueryEmp"  resultMap="QueryEmp_Map">
    select t1.id as e_id,t1.user_name,t2.id as d_id,t2.dept_name from emp t1
    INNER JOIN dept t2 on t1.dept_id=t2.id
    where t1.id=#{id}
</select>

QueryEmpDTO

public class QueryEmpDTO {

    private String deptName;
    private Integer deptId;
    private Integer id;
    private String username;

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "QueryEmpDTO{" +
                "deptName='" + deptName + '\'' +
                ", deptId=" + deptId +
                ", id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}

Test

@Test
public void test01() {
    try(SqlSession sqlSession = sqlSessionFactory.openSession()){
        // Mybatis在getMapper就會給我們創(chuàng)建jdk動態(tài)代理
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        QueryEmpDTO dto = mapper.QueryEmp(4);
        System.out.println(dto);
    }
}

4.2 嵌套結(jié)果

4.2.1 多對一

EmpMapper.xml

<!--嵌套結(jié)果   多 對 一  -->
<resultMap id="QueryEmp_Map2" type="Emp">
    <id column="e_id" property="id"></id>
    <result column="user_name" property="username"></result>
    <!--
    association 實(shí)現(xiàn)多對一中的  “一”
        property 指定對象中的嵌套對象屬性
    -->
    <association property="dept">
        <id column="d_id" property="id"></id>
        <id column="dept_name" property="deptName"></id>
    </association>
</resultMap>

<select id="QueryEmp2"  resultMap="QueryEmp_Map2">
    select t1.id as e_id,t1.user_name,t2.id as d_id,t2.dept_name from emp t1
    INNER JOIN dept t2 on t1.dept_id=t2.id
    where t1.id=#{id}
</select>

4.2.2 一對多

<!-- 嵌套結(jié)果: 一對多  查詢部門及所有員工 -->
<resultMap id="SelectDeptAndEmpsMap" type="Dept">
    <id column="d_id"  property="id"></id>
    <id column="dept_name"  property="deptName"></id>
    <!--
    <collection  映射一對多中的 “多”
        property 指定需要映射的“多”的屬性,一般聲明為List
        ofType  需要指定list的類型
    -->
    <collection property="emps" ofType="Emp" >
        <id column="e_id" property="id"></id>
        <result column="user_name" property="username"></result>
        <result column="create_date" property="createDate"></result>
    </collection>
</resultMap>

<select id="SelectDeptAndEmps" resultMap="SelectDeptAndEmpsMap">
    select t1.id as d_id,t1.dept_name,t2.id e_id,t2.user_name,t2.create_date from dept t1
    LEFT JOIN emp t2 on t1.id=t2.dept_id
    where t1.id=#{id}
</select>

Emp.java

import java.time.LocalDate;

public class Emp {
    private Integer id;
    private String username;
    private LocalDate createDate;
    private Dept dept;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public LocalDate getCreateDate() {
        return createDate;
    }

    public void setCreateDate(LocalDate createDate) {
        this.createDate = createDate;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", createDate=" + createDate +
                ", dept=" + dept +
                '}';
    }
}

Dept.java:

public class Dept {
    private Integer id;
    private String deptName;
    private List<Emp> emps;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }


    @Override
    public String toString() {
        return "Dept{" +
                "id=" + id +
                ", deptName='" + deptName + '\'' +
                ", emps=" + emps +
                '}';
    }
}

EmpMapper.java:

public interface EmpMapper {

    /*徐庶老師實(shí)際開發(fā)中的實(shí)現(xiàn)方式*/
    QueryEmpDTO QueryEmp(Integer id);

    /*實(shí)用嵌套結(jié)果實(shí)現(xiàn)聯(lián)合查詢  多對一 */
    Emp QueryEmp2(Integer id);


    /*實(shí)用嵌套查詢實(shí)現(xiàn)聯(lián)合查詢  多對一 */
    Emp QueryEmp3(Integer id);
}

DeptMapper.java:

public interface DeptMapper {
    //嵌套查詢: 一對多   使用部門id查詢員工
   Dept SelectDeptAndEmps(Integer id);

   // 嵌套查詢(異步查詢): 一對多  查詢部門及所有員工
    Dept SelectDeptAndEmps2(Integer id);
}

4.3 嵌套查詢

在上述邏輯的查詢中,是由我們自己來完成sql語句的關(guān)聯(lián)查詢的,那么,我們能讓mybatis幫我們實(shí)現(xiàn)自動的關(guān)聯(lián)查詢嗎?

4.3.1 多對一

EmpMapper.xml:

<!--嵌套查詢(分步查詢)   多 對 一
  聯(lián)合查詢和分步查詢區(qū)別:   性能區(qū)別不大
                            分部查詢支持 懶加載(延遲加載)
   需要設(shè)置懶加載,一定要使用嵌套查詢的。
   要啟動懶加載可以在全局配置文件中設(shè)置 lazyLoadingEnabled=true
   還可以單獨(dú)為某個(gè)分步查詢設(shè)置立即加載 <association fetchType="eager"
  -->
<resultMap id="QueryEmp_Map3" type="Emp">
    <id column="id" property="id"></id>
    <result column="user_name" property="username"></result>
    <!-- association 實(shí)現(xiàn)多對一中的  “一”
        property 指定對象中的嵌套對象屬性
        column  指定將哪個(gè)字段傳到分步查詢中
        select 指定分步查詢的 命名空間+ID
        以上3個(gè)屬性是實(shí)現(xiàn)分步查詢必須的屬性
        fetchType 可選, eager|lazy   eager立即加載   lazy跟隨全局配置文件中的lazyLoadingEnabled
     -->
    <association property="dept"    column="dept_id"  select="cn.tulingxueyuan.mapper.DeptMapper.SelectDept">
    </association>
</resultMap>

<select id="QueryEmp3"  resultMap="QueryEmp_Map3">
   select  * from emp where id=#{id}
</select>

DeptMapper.xml

<!-- 根據(jù)部門id查詢部門-->
<select id="SelectDept" resultType="dept">
    SELECT * FROM dept where id=#{id}
</select>

4.3.2 一對多

DeptMapper.xml

<!-- 嵌套查詢(異步查詢): 一對多  查詢部門及所有員工 -->
<resultMap id="SelectDeptAndEmpsMap2" type="Dept">
    <id column="d_id"  property="id"></id>
    <id column="dept_name"  property="deptName"></id>
    <!--
    <collection  映射一對多中的 “多”
        property 指定需要映射的“多”的屬性,一般聲明為List
        ofType  需要指定list的類型
        column 需要將當(dāng)前查詢的字段傳遞到異步查詢的參數(shù)
        select 指定異步查詢
    -->
    <collection property="emps" ofType="Emp" column="id" select="cn.tulingxueyuan.mapper.EmpMapper.SelectEmpByDeptId" >
    </collection>
</resultMap>

<select id="SelectDeptAndEmps2" resultMap="SelectDeptAndEmpsMap2">
    SELECT * FROM dept where id=#{id}
</select>

EmpMapper.xml

<!-- 根據(jù)部門id所有員工 -->
<select id="SelectEmpByDeptId"  resultType="emp">
    select  * from emp where dept_id=#{id}
</select>

Emp.java

public class Emp {
    private Integer id;
    private String username;
    private LocalDate createDate;
    private Dept dept;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public LocalDate getCreateDate() {
        return createDate;
    }

    public void setCreateDate(LocalDate createDate) {
        this.createDate = createDate;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", createDate=" + createDate +
                ", dept=" + dept +
                '}';
    }

}

Dept.java:

public class Dept {
    private Integer id;
    private String deptName;
    private List<Emp> emps;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }


    @Override
    public String toString() {
        return "Dept{" +
                "id=" + id +
                ", deptName='" + deptName + '\'' +
                ", emps=" + emps +
                '}';
    }
}

EmpMapper.java:

public interface EmpMapper {

    /*徐庶老師實(shí)際開發(fā)中的實(shí)現(xiàn)方式*/
    QueryEmpDTO QueryEmp(Integer id);

    /*實(shí)用嵌套結(jié)果實(shí)現(xiàn)聯(lián)合查詢  多對一 */
    Emp QueryEmp2(Integer id);


    /*實(shí)用嵌套查詢實(shí)現(xiàn)聯(lián)合查詢  多對一 */
    Emp QueryEmp3(Integer id);
}

DeptMapper.java:

public interface DeptMapper {
    //嵌套查詢: 一對多   使用部門id查詢員工
   Dept SelectDeptAndEmps(Integer id);

   // 嵌套查詢(異步查詢): 一對多  查詢部門及所有員工
    Dept SelectDeptAndEmps2(Integer id);
}

4.4 延遲查詢

當(dāng)我們在進(jìn)行表關(guān)聯(lián)的時(shí)候,有可能在查詢結(jié)果的時(shí)候不需要關(guān)聯(lián)對象的屬性值(select count(1)…),那么此時(shí)可以通過延遲加載來實(shí)現(xiàn)功能。在全局配置文件中添加如下屬性
mybatis-config.xml

<!-- 開啟延遲加載,所有分步查詢都是懶加載 (默認(rèn)是立即加載)-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--當(dāng)開啟式, 使用pojo中任意屬性都會加載延遲查詢 ,默認(rèn)是false
<setting name="aggressiveLazyLoading" value="false"/>-->
<!--設(shè)置對象的哪些方法調(diào)用會加載延遲查詢   默認(rèn):equals,clone,hashCode,toString-->
<setting name="lazyLoadTriggerMethods" value=""/>

如果設(shè)置了全局加載,但是希望在某一個(gè)sql語句查詢的時(shí)候不使用延時(shí)策略,可以添加fetchType下屬性:

<association property="dept" fetchType="eager"  column="dept_id"  select="cn.tulingxueyuan.mapper.DeptMapper.SelectDept">
</association>

4.5 總結(jié)

在這里插入圖片描述

三種關(guān)聯(lián)關(guān)系都有兩種關(guān)聯(lián)查詢的方式: 嵌套查詢,嵌套結(jié)果
Mybatis的延遲加載配置, 在全局配置文件中加入下面代碼

<settings>
	<setting name=”lazyLoadingEnabled” value=”true” />
	<setting name=”aggressiveLazyLoading” value=”false”/>
</settings>

在映射文件中,元素和元素中都已默認(rèn)配置了延遲加載屬性,即默認(rèn)屬性fetchType=”lazy”(屬性fetchType=”eager”表示立即加載),所以在配置文件中開啟延遲加載后,無需在映射文件中再做配置

一對一

使用元素進(jìn)行一對一關(guān)聯(lián)映射非常簡單,只需要參考如下兩種示例配置即可

在這里插入圖片描述

一對多

<resultMap>元素中,包含了一個(gè)<collection>子元素,MyBatis就是通過該元素來處理一對多關(guān)聯(lián)關(guān)系的
<collection>子元素的屬性大部分與<association>元素相同,但其還包含一個(gè)特殊屬性–ofType
ofType屬性與javaType屬性對應(yīng),它用于指定實(shí)體對象中集合類屬性所包含的元素類型。
<collection >元素的使用也非常簡單,同樣可以參考如下兩種示例進(jìn)行配置,具體代碼如下:

在這里插入圖片描述

多對多

多對多的關(guān)聯(lián)關(guān)系查詢,同樣可以使用前面介紹的元素進(jìn)行處理(其用法和一對多關(guān)聯(lián)關(guān)系查詢語句用法基本相同)

五 動態(tài)sql

動態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過 JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號。利用動態(tài) SQL,可以徹底擺脫這種痛苦。
使用動態(tài) SQL 并非一件易事,但借助可用于任何 SQL 映射語句中的強(qiáng)大的動態(tài) SQL 語言,MyBatis 顯著地提升了這一特性的易用性。
如果你之前用過 JSTL 或任何基于類 XML 語言的文本處理器,你對動態(tài) SQL 元素可能會感覺似曾相識。在 MyBatis 之前的版本中,需要花時(shí)間了解大量的元素。借助功能強(qiáng)大的基于 OGNL 的表達(dá)式,MyBatis 3 替換了之前的大部分元素,大大精簡了元素種類,現(xiàn)在要學(xué)習(xí)的元素種類比原來的一半還要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach
  • bind
  • sql片段

5.1 if

EmpDao.xml

<select id="getEmpByCondition" resultType="cn.tulingxueyuan.bean.Emp">
    select * from emp where 
    <if test="empno!=null">
        empno = #{empno} and
    </if>
    <if test="ename!=null">
        ename like #{ename} and
    </if>
    <if test="sal!=null">
        sal > #{sal}
    </if>
</select>

上邊代碼看起來是比較正常的,但是大家需要注意的是如果我們傳入的參數(shù)值有缺失會怎么呢?這個(gè)時(shí)候拼接的sql語句就會變得有問題,例如不傳參數(shù)或者丟失最后一個(gè)參數(shù),那么語句中就會多一個(gè)where或者and的關(guān)鍵字,因此在mybatis中也給出了具體的解決方案:

where

where 元素只會在子元素返回任何內(nèi)容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會將它們?nèi)コ?/p>

<select id="getEmpByCondition" resultType="cn.tulingxueyuan.bean.Emp">
    select * from emp
    <where>
        <if test="empno!=null">
            empno = #{empno}
        </if>
        <if test="ename!=null">
            and ename like #{ename}
        </if>
        <if test="sal!=null">
            and sal > #{sal}
        </if>
    </where>
</select>

現(xiàn)在看起來沒有什么問題了,但是我們的條件添加到了拼接sql語句的前后,那么我們該如何處理呢?

trim

 <!--
 trim截取字符串:
 prefix:前綴,為sql整體添加一個(gè)前綴
 prefixOverrides:去除整體字符串前面多余的字符
 suffixOverrides:去除后面多余的字符串
 -->
 <select id="getEmpByCondition" resultType="cn.tulingxueyuan.bean.Emp">
     select * from emp

     <trim prefix="where" prefixOverrides="and" suffixOverrides="and">
         <if test="empno!=null">
             empno = #{empno} and
         </if>
         <if test="ename!=null">
             ename like #{ename} and
         </if>
         <if test="sal!=null">
             sal > #{sal} and
         </if>
     </trim>
 </select>

5.2 foreach

動態(tài) SQL 的另一個(gè)常見使用場景是對集合進(jìn)行遍歷(尤其是在構(gòu)建 IN 條件語句的時(shí)候)。

 <!--foreach是對集合進(jìn)行遍歷
	 collection="deptnos" 指定要遍歷的集合
	 close="" 表示以什么結(jié)束
	 index="" 給定一個(gè)索引值
	 item="" 遍歷的每一個(gè)元素的值
	 open="" 表示以什么開始
	 separator="" 表示多個(gè)元素的分隔符
 -->
 <select id="getEmpByDeptnos" resultType="Emp">
    select * from emp where deptno in
     <foreach collection="deptnos" close=")" index="idx" item="deptno" open="(" separator=",">
        #{deptno}
     </foreach>
 </select>

5.3 choose、when、otherwise

有時(shí)候,我們不想使用所有的條件,而只是想從多個(gè)條件中選擇一個(gè)使用。針對這種情況,MyBatis 提供了 choose 元素,它有點(diǎn)像 Java 中的 switch 語句。

<select id="getEmpByConditionChoose" resultType="cn.tulingxueyuan.bean.Emp">
        select * from emp
     <where>
         <choose>
             <when test="empno!=null">
                 empno > #{empno}
             </when>
             <when test="ename!=null">
                 ename like #{ename}
             </when>
             <when test="sal!=null">
                 sal > #{sal}
             </when>
             <otherwise>
                 1=1
             </otherwise>
         </choose>
     </where>
 </select>

5.4 set

用于動態(tài)更新語句的類似解決方案叫做 set。set 元素可以用于動態(tài)包含需要更新的列,忽略其它不更新的列。

<update id="updateEmpByEmpno">
  update emp
   <set>
       <if test="empno!=null">
          empno=#{empno},
       </if>
       <if test="ename!=null">
          ename = #{ename},
       </if>
       <if test="sal!=null">
          sal = #{sal}
       </if>
   </set>
   <where>
      empno = #{empno}
   </where>
</update>

5.5 bind

bind 元素允許你在 OGNL 表達(dá)式以外創(chuàng)建一個(gè)變量,并將其綁定到當(dāng)前的上下文。比如:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>

5.6 sql

這個(gè)元素可以用來定義可重用的 SQL 代碼片段,以便在其它語句中使用。 參數(shù)可以靜態(tài)地(在加載的時(shí)候)確定下來,并且可以在不同的 include 元素中定義不同的參數(shù)值。比如:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

這個(gè) SQL 片段可以在其它語句中使用,例如:

<select id="selectUsers" resultType="map">
  select
    <include refid="userColumns"><property name="alias" value="t1"/></include>,
    <include refid="userColumns"><property name="alias" value="t2"/></include>
  from some_table t1
    cross join some_table t2
</select>

六 MyBatis緩存

6.1 緩存介紹

MyBatis 內(nèi)置了一個(gè)強(qiáng)大的事務(wù)性查詢緩存機(jī)制,它可以非常方便地配置和定制。 為了使它更加強(qiáng)大而且易于配置,我們對 MyBatis 3 中的緩存實(shí)現(xiàn)進(jìn)行了許多改進(jìn)。
默認(rèn)情況下,只啟用了本地的會話緩存,它僅僅對一個(gè)會話中的數(shù)據(jù)進(jìn)行緩存。 要啟用全局的二級緩存,只需要在你的 SQL 映射文件中添加一行:

<cache/>

當(dāng)添加上該標(biāo)簽之后,會有如下效果:

  • 映射語句文件中的所有 select 語句的結(jié)果將會被緩存。
  • 映射語句文件中的所有 insert、update 和 delete 語句會刷新緩存。
  • 緩存會使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。
  • 緩存不會定時(shí)進(jìn)行刷新(也就是說,沒有刷新間隔)。
  • 緩存會保存列表或?qū)ο螅o論查詢方法返回哪種)的 1024 個(gè)引用。
  • 緩存會被視為讀/寫緩存,這意味著獲取到的對象并不是共享的,可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。

在進(jìn)行配置的時(shí)候還會分為一級緩存和二級緩存:

  • 一級緩存:線程級別的緩存,是本地緩存,sqlSession級別的緩存
  • 二級緩存:全局范圍的緩存,不止局限于當(dāng)前會話

6.2 一級緩存的使用

一級緩存是sqlsession級別的緩存,默認(rèn)是存在的。在下面的案例中,大家發(fā)現(xiàn)我發(fā)送了兩個(gè)相同的請求,但是sql語句僅僅執(zhí)行了一次,那么就意味著第一次查詢的時(shí)候已經(jīng)將結(jié)果進(jìn)行了緩存。

@Test
public void test01() {
?
     SqlSession sqlSession = sqlSessionFactory.openSession();
     try {
         EmpDao mapper = sqlSession.getMapper(EmpDao.class);
         List<Emp> list = mapper.selectAllEmp();
         for (Emp emp : list) {
             System.out.println(emp);
        }
         System.out.println("--------------------------------");
         List<Emp> list2 = mapper.selectAllEmp();
         for (Emp emp : list2) {
             System.out.println(emp);
        }
    } catch (Exception e) {
         e.printStackTrace();
    } finally {
         sqlSession.close();
    }
}

在大部分的情況下一級緩存是可以的,但是有幾種特殊的情況會造成一級緩存失效:

1、一級緩存是sqlSession級別的緩存,如果在應(yīng)用程序中只有開啟了多個(gè)sqlsession,那么會造成緩存失效

 @Test
 public void test02(){
     SqlSession sqlSession = sqlSessionFactory.openSession();
     EmpDao mapper = sqlSession.getMapper(EmpDao.class);
     List<Emp> list = mapper.selectAllEmp();
     for (Emp emp : list) {
         System.out.println(emp);
    }
     System.out.println("================================");
     SqlSession sqlSession2 = sqlSessionFactory.openSession();
     EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class);
     List<Emp> list2 = mapper2.selectAllEmp();
     for (Emp emp : list2) {
         System.out.println(emp);
    }
     sqlSession.close();
     sqlSession2.close();
}

2、在編寫查詢的sql語句的時(shí)候,一定要注意傳遞的參數(shù),如果參數(shù)不一致,那么也不會緩存結(jié)果
3、如果在發(fā)送過程中發(fā)生了數(shù)據(jù)的修改,那么結(jié)果就不會緩存

@Test
public void test03(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    EmpDao mapper = sqlSession.getMapper(EmpDao.class);
    Emp empByEmpno = mapper.findEmpByEmpno(1111);
    System.out.println(empByEmpno);
    System.out.println("================================");
    empByEmpno.setEname("zhangsan");
    int i = mapper.updateEmp(empByEmpno);
    System.out.println(i);
    System.out.println("================================");
    Emp empByEmpno1 = mapper.findEmpByEmpno(1111);
    System.out.println(empByEmpno1);
    sqlSession.close();
}

4、在兩次查詢期間,手動去清空緩存,也會讓緩存失效

@Test
public void test03(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    EmpDao mapper = sqlSession.getMapper(EmpDao.class);
    Emp empByEmpno = mapper.findEmpByEmpno(1111);
    System.out.println(empByEmpno);
    System.out.println("================================");
    System.out.println("手動清空緩存");
    sqlSession.clearCache();
    System.out.println("================================");
    Emp empByEmpno1 = mapper.findEmpByEmpno(1111);
    System.out.println(empByEmpno1);
    sqlSession.close();
}

特性

一級緩存特性:

  1. 默認(rèn)就開啟了,也可以關(guān)閉一級緩存 localCacheScope=STATEMENT
  2. 作用域:是基于sqlSession(默認(rèn)),一次數(shù)據(jù)庫操作會話。
  3. 緩存默認(rèn)實(shí)現(xiàn)類PerpetualCache ,使用map進(jìn)行存儲的
  4. 查詢完就會進(jìn)行存儲
  5. 先從二級緩存中獲取,再從一級緩存中獲取 key==> sqlid+sql

一級緩存失效情況:

  1. 不同的sqlSession會使一級緩存失效
  2. 同一個(gè)SqlSession,但是查詢語句不一樣
  3. 同一個(gè)SqlSession,查詢語句一樣,期間執(zhí)行增刪改操作
  4. 同一個(gè)SqlSession,查詢語句一樣,執(zhí)行手動清除緩存

6.3 二級緩存的使用

二級緩存是全局作用域緩存,默認(rèn)是不開啟的,需要手動進(jìn)行配置。
Mybatis提供二級緩存的接口以及實(shí)現(xiàn),緩存實(shí)現(xiàn)的時(shí)候要求實(shí)體類實(shí)現(xiàn)Serializable接口,二級緩存在sqlSession關(guān)閉或提交之后才會生效。

二級緩存的使用

步驟:
1、全局配置文件中添加如下配置:

<setting name="cacheEnabled" value="true"/>

2、需要在使用二級緩存的映射文件處使用標(biāo)簽標(biāo)注
3、實(shí)體類必須要實(shí)現(xiàn)Serializable接口

@Test
public void test04(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    SqlSession sqlSession2 = sqlSessionFactory.openSession();
    EmpDao mapper = sqlSession.getMapper(EmpDao.class);
    EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class);
    Emp empByEmpno = mapper.findEmpByEmpno(1111);
    System.out.println(empByEmpno);
    sqlSession.close();
?
    Emp empByEmpno1 = mapper2.findEmpByEmpno(1111);
    System.out.println(empByEmpno1);
    sqlSession2.close();
}

緩存的屬性

  • eviction:表示緩存回收策略,默認(rèn)是
    • LRU LRU:最近最少使用的,移除最長時(shí)間不被使用的對象
    • FIFO:先進(jìn)先出,按照對象進(jìn)入緩存的順序來移除
    • SOFT:軟引用,移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象
    • WEAK:弱引用,更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象
  • flushInternal:刷新間隔,單位毫秒
    • 默認(rèn)情況是不設(shè)置,也就是沒有刷新間隔,緩存僅僅調(diào)用語句時(shí)刷新
  • size:引用數(shù)目,正整數(shù)
    • 代表緩存最多可以存儲多少個(gè)對象,太大容易導(dǎo)致內(nèi)存溢出
  • readonly:只讀,true/false
    • true:只讀緩存,會給所有調(diào)用這返回緩存對象的相同實(shí)例,因此這些對象不能被修改。
    • false:讀寫緩存,會返回緩存對象的拷貝(序列化實(shí)現(xiàn)),這種方式比較安全,默認(rèn)值
//可以看到會去二級緩存中查找數(shù)據(jù),而且二級緩存跟一級緩存中不會同時(shí)存在數(shù)據(jù),因?yàn)槎壘彺嬷械臄?shù)據(jù)是在sqlsession 關(guān)閉之后才生效的
@Test
public void test05(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    EmpDao mapper = sqlSession.getMapper(EmpDao.class);
    Emp empByEmpno = mapper.findEmpByEmpno(1111);
    System.out.println(empByEmpno);
    sqlSession.close();
?
    SqlSession sqlSession2 = sqlSessionFactory.openSession();
    EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class);
    Emp empByEmpno2 = mapper2.findEmpByEmpno(1111);
    System.out.println(empByEmpno2);
    Emp empByEmpno3 = mapper2.findEmpByEmpno(1111);
    System.out.println(empByEmpno3);
    sqlSession2.close();
}

緩存查詢的順序是先查詢二級緩存再查詢一級緩存

@Test
public void test05(){
     SqlSession sqlSession = sqlSessionFactory.openSession();
     EmpDao mapper = sqlSession.getMapper(EmpDao.class);
     Emp empByEmpno = mapper.findEmpByEmpno(1111);
     System.out.println(empByEmpno);
     sqlSession.close();
?
     SqlSession sqlSession2 = sqlSessionFactory.openSession();
     EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class);
     Emp empByEmpno2 = mapper2.findEmpByEmpno(1111);
     System.out.println(empByEmpno2);
     Emp empByEmpno3 = mapper2.findEmpByEmpno(1111);
     System.out.println(empByEmpno3);
?
     Emp empByEmpno4 = mapper2.findEmpByEmpno(7369);
     System.out.println(empByEmpno4);
     Emp empByEmpno5 = mapper2.findEmpByEmpno(7369);
     System.out.println(empByEmpno5);
     sqlSession2.close();
}

二級緩存的作用范圍

如果設(shè)置了全局的二級緩存配置,那么在使用的時(shí)候需要注意,在每一個(gè)單獨(dú)的select語句中,可以設(shè)置將查詢緩存關(guān)閉,以完成特殊的設(shè)置

1、在setting中設(shè)置,是配置二級緩存開啟,一級緩存默認(rèn)一直開啟

<setting name="cacheEnabled" value="true"/>

2、select標(biāo)簽的useCache屬性:

在每一個(gè)select的查詢中可以設(shè)置當(dāng)前查詢是否要使用二級緩存,只對二級緩存有效

3、sql標(biāo)簽的flushCache屬性

增刪改操作默認(rèn)值為true,sql執(zhí)行之后會清空一級緩存和二級緩存,而查詢操作默認(rèn)是false

4、sqlSession.clearCache()

只是用來清除一級緩存

二級緩存特性

  • 默認(rèn)開啟了,沒有實(shí)現(xiàn)
  • 作用域:基于全局范圍,應(yīng)用級別。
  • 緩存默認(rèn)實(shí)現(xiàn)類PerpetualCache ,使用map進(jìn)行存儲的但是二級緩存根據(jù)不同的mapper命名空間多包了一層map
 : org.apache.ibatis.session.Configuration#caches    key:mapper命名空間   value:erpetualCache.map
 key==> sqlid+sql
  • 事務(wù)提交的時(shí)候(sqlSession關(guān)閉)
  • 先從二級緩存中獲取,再從一級緩存中獲取

實(shí)現(xiàn):

  1. 開啟二級緩存<setting name="cacheEnabled" value="true"/>
  2. 在需要使用到二級緩存的映射文件中加入,基于Mapper映射文件來實(shí)現(xiàn)緩存的,基于Mapper映射文件的命名空間來存儲的
  3. 在需要使用到二級緩存的javaBean中實(shí)現(xiàn)序列化接口implements Serializable 配置成功就會出現(xiàn)緩存命中率 同一個(gè)sqlId: 從緩存中拿出的次數(shù)/查詢總次數(shù)

失效:

  1. 同一個(gè)命名空間進(jìn)行了增刪改的操作,會導(dǎo)致二級緩存失效 但是如果不想失效:可以將SQL的flushCache 這是為false,但是要慎重設(shè)置,因?yàn)闀斐蓴?shù)據(jù)臟讀問題,除非你能保證查詢的數(shù)據(jù)永遠(yuǎn)不會執(zhí)行增刪改
  2. 讓查詢不緩存數(shù)據(jù)到二級緩存中useCache=“false”
  3. 如果希望其他mapper映射文件的命名空間執(zhí)行了增刪改清空另外的命名空間就可以設(shè)置:
<cache-ref namespace="cn.tulingxueyuan.mapper.DeptMapper"/>

6.4 整合第三方緩存

整合redis

添加redis-mybatis 緩存適配器 依賴

<dependencies>
    <!--添加依賴-->
    <dependency>
        <groupId>org.mybatis.caches</groupId>
        <artifactId>mybatis-redis</artifactId>
        <version>1.0.0-beta2</version>
    </dependency>
</dependencies>

添加redis.properties在resources根目錄

host=localhost
port=6379
connectionTimeout=5000
soTimeout=5000
password=無密碼可不填
database=0
clientName=

設(shè)置mybatis二級緩存實(shí)現(xiàn)類

<cache ... type="org.mybatis.caches.redis.RedisCache" ....../>

整合ehcache

導(dǎo)入對應(yīng)的maven依賴

<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
 <dependency>
     <groupId>org.ehcache</groupId>
     <artifactId>ehcache</artifactId>
     <version>3.8.1</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
 <dependency>
     <groupId>org.mybatis.caches</groupId>
     <artifactId>mybatis-ehcache</artifactId>
     <version>1.2.0</version>
 </dependency>

導(dǎo)入ehcache配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!-- 磁盤保存路徑 -->
<diskStore path="D:\ehcache" />

<defaultCache
  maxElementsInMemory="1"
  maxElementsOnDisk="10000000"
  eternal="false"
  overflowToDisk="true"
  timeToIdleSeconds="120"
  timeToLiveSeconds="120"
  diskExpiryThreadIntervalSeconds="120"
  memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>

<!--
屬性說明:
l diskStore:指定數(shù)據(jù)在磁盤中的存儲位置。
l defaultCache:當(dāng)借助CacheManager.add("demoCache")創(chuàng)建Cache時(shí),EhCache便會采用<defalutCache/>指定的的管理策略

以下屬性是必須的:
l maxElementsInMemory - 在內(nèi)存中緩存的element的最大數(shù)目
l maxElementsOnDisk - 在磁盤上緩存的element的最大數(shù)目,若是0表示無窮大
l eternal - 設(shè)定緩存的elements是否永遠(yuǎn)不過期。如果為true,則緩存的數(shù)據(jù)始終有效,如果為false那么還要根據(jù)timeToIdleSeconds,timeToLiveSeconds判斷
l overflowToDisk - 設(shè)定當(dāng)內(nèi)存緩存溢出的時(shí)候是否將過期的element緩存到磁盤上

以下屬性是可選的:
l timeToIdleSeconds - 當(dāng)緩存在EhCache中的數(shù)據(jù)前后兩次訪問的時(shí)間超過timeToIdleSeconds的屬性取值時(shí),這些數(shù)據(jù)便會刪除,默認(rèn)值是0,也就是可閑置時(shí)間無窮大
l timeToLiveSeconds - 緩存element的有效生命期,默認(rèn)是0.,也就是element存活時(shí)間無窮大
diskSpoolBufferSizeMB 這個(gè)參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小.默認(rèn)是30MB.每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū).
l diskPersistent - 在VM重啟的時(shí)候是否啟用磁盤保存EhCache中的數(shù)據(jù),默認(rèn)是false。
l diskExpiryThreadIntervalSeconds - 磁盤緩存的清理線程運(yùn)行間隔,默認(rèn)是120秒。每個(gè)120s,相應(yīng)的線程會進(jìn)行一次EhCache中數(shù)據(jù)的清理工作
l memoryStoreEvictionPolicy - 當(dāng)內(nèi)存緩存達(dá)到最大,有新的element加入的時(shí)候, 移除緩存中element的策略。默認(rèn)是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進(jìn)先出)
-->

在mapper文件中添加自定義緩存

<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

七 MyBatis分頁插件&逆向工程

7.1 分頁插件

MyBatis 通過提供插件機(jī)制,讓我們可以根據(jù)自己的需要去增強(qiáng)MyBatis 的功能。需要注意的是,如果沒有完全理解MyBatis 的運(yùn)行原理和插件的工作方式,最好不要使用插件,因?yàn)樗鼤淖兿档讓拥墓ぷ鬟壿?,給系統(tǒng)帶來很大的影響。
  MyBatis 的插件可以在不修改原來的代碼的情況下,通過攔截的方式,改變四大核心對象的行為,比如處理參數(shù),處理SQL,處理結(jié)果。

Mybatis插件典型適用場景

分頁功能
mybatis的分頁默認(rèn)是基于內(nèi)存分頁的(查出所有,再截?。?,數(shù)據(jù)量大的情況下效率較低,不過使用mybatis插件可以改變該行為,只需要攔截StatementHandler類的prepare方法,改變要執(zhí)行的SQL語句為分頁語句即可;

公共字段統(tǒng)一賦值
一般業(yè)務(wù)系統(tǒng)都會有創(chuàng)建者,創(chuàng)建時(shí)間,修改者,修改時(shí)間四個(gè)字段,對于這四個(gè)字段的賦值,實(shí)際上可以在DAO層統(tǒng)一攔截處理,可以用mybatis插件攔截Executor類的update方法,對相關(guān)參數(shù)進(jìn)行統(tǒng)一賦值即可;

性能監(jiān)控
對于SQL語句執(zhí)行的性能監(jiān)控,可以通過攔截Executor類的update, query等方法,用日志記錄每個(gè)方法執(zhí)行的時(shí)間;

其它
其實(shí)mybatis擴(kuò)展性還是很強(qiáng)的,基于插件機(jī)制,基本上可以控制SQL執(zhí)行的各個(gè)階段,如執(zhí)行階段,參數(shù)處理階段,語法構(gòu)建階段,結(jié)果集處理階段,具體可以根據(jù)項(xiàng)目業(yè)務(wù)來實(shí)現(xiàn)對應(yīng)業(yè)務(wù)邏輯。

實(shí)現(xiàn)思考:
第一個(gè)問題:
  不修改對象的代碼,怎么對對象的行為進(jìn)行修改,比如說在原來的方法前面做一點(diǎn)事情,在原來的方法后面做一點(diǎn)事情?
  答案:大家很容易能想到用代理模式,這個(gè)也確實(shí)是MyBatis 插件的原理。
  
第二個(gè)問題:
  我們可以定義很多的插件,那么這種所有的插件會形成一個(gè)鏈路,比如我們提交一個(gè)休假申請,先是項(xiàng)目經(jīng)理審批,然后是部門經(jīng)理審批,再是HR 審批,再到總經(jīng)理審批,怎么實(shí)現(xiàn)層層的攔截?
  答案:插件是層層攔截的,我們又需要用到另一種設(shè)計(jì)模式——責(zé)任鏈模式。
  
  在之前的源碼中我們也發(fā)現(xiàn)了,mybatis內(nèi)部對于插件的處理確實(shí)使用的代理模式,既然是代理模式,我們應(yīng)該了解MyBatis 允許哪些對象的哪些方法允許被攔截,并不是每一個(gè)運(yùn)行的節(jié)點(diǎn)都是可以被修改的。只有清楚了這些對象的方法的作用,當(dāng)我們自己編寫插件的時(shí)候才知道從哪里去攔截。在MyBatis 官網(wǎng)有答案,我們來看一下:https://mybatis.org/mybatis-3/zh/configuration.html#plugins

在這里插入圖片描述

Executor 會攔截到CachingExcecutor 或者BaseExecutor。因?yàn)閯?chuàng)建Executor 時(shí)是先創(chuàng)建CachingExcecutor,再包裝攔截。從代碼順序上能看到。我們可以通過mybatis的分頁插件來看看整個(gè)插件從包裝攔截器鏈到執(zhí)行攔截器鏈的過程。
  在查看插件原理的前提上,我們需要來看看官網(wǎng)對于自定義插件是怎么來做的,官網(wǎng)上有介紹:通過 MyBatis 提供的強(qiáng)大機(jī)制,使用插件是非常簡單的,只需實(shí)現(xiàn) Interceptor 接口,并指定想要攔截的方法簽名即可。這里本人踩了一個(gè)坑,在Springboot中集成,同時(shí)引入了pagehelper-spring-boot-starter 導(dǎo)致RowBounds參數(shù)的值被刷掉了,也就是走到了我的攔截其中沒有被設(shè)置值,這里需要注意,攔截器出了問題,可以Debug看一下Configuration配置類中攔截器鏈的包裝情況。

自定義分頁插件

@Intercepts({
        @Signature(type = Executor.class,method = "query" ,args ={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} ), // 需要代理的對象和方法
        @Signature(type = Executor.class,method = "query" ,args ={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class} ) // 需要代理的對象和方法
})
public class MyPageInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("簡易版的分頁插件:邏輯分頁改成物理分頁");

        // 修改sql 拼接Limit 0,10
        Object[] args = invocation.getArgs();
        // MappedStatement 對mapper映射文件里面元素的封裝
        MappedStatement ms= (MappedStatement) args[0];
        // BoundSql 對sql和參數(shù)的封裝
        Object parameterObject=args[1];
        BoundSql boundSql = ms.getBoundSql(parameterObject);
        // RowBounds 封裝了邏輯分頁的參數(shù) :當(dāng)前頁offset,一頁數(shù)limit
        RowBounds rowBounds= (RowBounds) args[2];

        // 拿到原來的sql語句
        String sql = boundSql.getSql();
        String limitSql=sql+ " limit "+rowBounds.getOffset()+","+ rowBounds.getLimit();

        //將分頁sql重新封裝一個(gè)BoundSql 進(jìn)行后續(xù)執(zhí)行
        BoundSql pageBoundSql = new BoundSql(ms.getConfiguration(), limitSql, boundSql.getParameterMappings(), parameterObject);

        // 被代理的對象
        Executor executor= (Executor) invocation.getTarget();
        CacheKey cacheKey = executor.createCacheKey(ms, parameterObject, rowBounds, pageBoundSql);
        // 調(diào)用修改過后的sql繼續(xù)執(zhí)行查詢
        return  executor.query(ms,parameterObject,rowBounds, (ResultHandler) args[3],cacheKey,pageBoundSql);
    }
}

攔截簽名跟參數(shù)的順序有嚴(yán)格要求,如果按照順序找不到對應(yīng)方法會拋出異常:

org.apache.ibatis.exceptions.PersistenceException:
            ### Error opening session.  Cause: org.apache.ibatis.plugin.PluginException: 
            Could not find method on interface org.apache.ibatis.executor.Executor named queryv

MyBatis 啟動時(shí)掃描 標(biāo)簽, 注冊到Configuration 對象的 InterceptorChain 中。property 里面的參數(shù),會調(diào)用setProperties()方法處理。

分頁插件使用
添加pom依賴:

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>1.2.15</version>
</dependency>

插件注冊,在mybatis-config.xml 中注冊插件:

<configuration>

	<plugins>
		<!-- com.github.pagehelper為PageHelper類所在包名 -->
		<plugin interceptor="com.github.pagehelper.PageHelper">
			<property name="helperDialect" value="mysql" />
			<!-- 該參數(shù)默認(rèn)為false -->
			<!-- 設(shè)置為true時(shí),會將RowBounds第一個(gè)參數(shù)offset當(dāng)成pageNum頁碼使用 -->
			<!-- 和startPage中的pageNum效果一樣 -->
			<property name="offsetAsPageNum" value="true" />
			<!-- 該參數(shù)默認(rèn)為false -->
			<!-- 設(shè)置為true時(shí),使用RowBounds分頁會進(jìn)行count查詢 -->
			<property name="rowBoundsWithCount" value="true" />
			<!-- 設(shè)置為true時(shí),如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結(jié)果 -->
			<!-- (相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是Page類型) -->
			<property name="pageSizeZero" value="true" />
			<!-- 3.3.0版本可用 - 分頁參數(shù)合理化,默認(rèn)false禁用 -->
			<!-- 啟用合理化時(shí),如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 -->
			<!-- 禁用合理化時(shí),如果pageNum<1或pageNum>pages會返回空數(shù)據(jù) -->
			<property name="reasonable" value="true" />
			<!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
			<!-- 增加了一個(gè)`params`參數(shù)來配置參數(shù)映射,用于從Map或ServletRequest中取值 -->
			<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值 -->
			<!-- 不理解該含義的前提下,不要隨便復(fù)制該配置 -->
			<property name="params" value="pageNum=start;pageSize=limit;" />
		</plugin>
	</plugins>
</configuration>

調(diào)用

// 獲取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis/mybatis-config.xml");
// 通過加載配置文件獲取SqlSessionFactory對象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    // Mybatis在getMapper就會給我們創(chuàng)建jdk動態(tài)代理
    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
    PageHelper.startPage(1, 5);
    List<Emp> list=mapper.selectAll(); 
    PageInfo<ServiceStation> info = new PageInfo<ServiceStation>(list, 3);                   
          System.out.println("當(dāng)前頁碼:"+info.getPageNum());
          System.out.println("每頁的記錄數(shù):"+info.getPageSize());
          System.out.println("總記錄數(shù):"+info.getTotal());
          System.out.println("總頁碼:"+info.getPages());
          System.out.println("是否第一頁:"+info.isIsFirstPage());
          System.out.println("連續(xù)顯示的頁碼:");
          int[] nums = info.getNavigatepageNums();
          for (int i = 0; i < nums.length; i++) {
               System.out.println(nums[i]);
          }     
}  

代理和攔截是怎么實(shí)現(xiàn)的?
  上面提到的可以被代理的四大對象都是什么時(shí)候被代理的呢?Executor 是openSession() 的時(shí)候創(chuàng)建的; StatementHandler 是SimpleExecutor.doQuery()創(chuàng)建的;里面包含了處理參數(shù)的ParameterHandler 和處理結(jié)果集的ResultSetHandler 的創(chuàng)建,創(chuàng)建之后即調(diào)用InterceptorChain.pluginAll(),返回層層代理后的對象。代理是由Plugin 類創(chuàng)建。在我們重寫的 plugin() 方法里面可以直接調(diào)用returnPlugin.wrap(target, this);返回代理對象。
  單個(gè)插件的情況下,代理能不能被代理?代理順序和調(diào)用順序的關(guān)系? 可以被代理。

在這里插入圖片描述

因?yàn)榇眍愂荘lugin,所以最后調(diào)用的是Plugin 的invoke()方法。它先調(diào)用了定義的攔截器的intercept()方法??梢酝ㄟ^invocation.proceed()調(diào)用到被代理對象被攔截的方法。

在這里插入圖片描述

調(diào)用流程時(shí)序圖:

在這里插入圖片描述

PageHelper 原理
  先來看一下分頁插件的簡單用法:

PageHelper.startPage(1, 3);
List<Blog> blogs = blogMapper.selectBlogById2(blog);
PageInfo page = new PageInfo(blogs, 3);

對于插件機(jī)制我們上面已經(jīng)介紹過了,在這里我們自然的會想到其所涉及的核心類 :PageInterceptor。攔截的是Executor 的兩個(gè)query()方法,要實(shí)現(xiàn)分頁插件的功能,肯定是要對我們寫的sql進(jìn)行改寫,那么一定是在 intercept 方法中進(jìn)行操作的,我們會發(fā)現(xiàn)這么一行代碼:

 String pageSql = this.dialect.getPageSql(ms, boundSql, parameter, rowBounds, cacheKey);

調(diào)用到 AbstractHelperDialect 中的 getPageSql 方法:

public String getPageSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey pageKey) {
        // 獲取sql
        String sql = boundSql.getSql();
        //獲取分頁參數(shù)對象
        Page page = this.getLocalPage();
        return this.getPageSql(sql, page, pageKey);
    }

這里可以看到會去調(diào)用 this.getLocalPage(),我們來看看這個(gè)方法:

public <T> Page<T> getLocalPage() {
  return PageHelper.getLocalPage();
}
//線程獨(dú)享
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
public static <T> Page<T> getLocalPage() {
  return (Page)LOCAL_PAGE.get();
}

可以發(fā)現(xiàn)這里是調(diào)用的是PageHelper的一個(gè)本地線程變量中的一個(gè) Page對象,從其中獲取我們所設(shè)置的 PageSize 與 PageNum,那么他是怎么設(shè)置值的呢?請看:

PageHelper.startPage(1, 3);

public static <E> Page<E> startPage(int pageNum, int pageSize) {
        return startPage(pageNum, pageSize, true);
}

public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
        Page<E> page = new Page(pageNum, pageSize, count);
        page.setReasonable(reasonable);
        page.setPageSizeZero(pageSizeZero);
        Page<E> oldPage = getLocalPage();
        if (oldPage != null && oldPage.isOrderByOnly()) {
            page.setOrderBy(oldPage.getOrderBy());
     }
        //設(shè)置頁數(shù),行數(shù)信息
        setLocalPage(page);
        return page;
}

protected static void setLocalPage(Page page) {
        //設(shè)置值
        LOCAL_PAGE.set(page);
}

在我們調(diào)用 PageHelper.startPage(1, 3); 的時(shí)候,系統(tǒng)會調(diào)用 LOCAL_PAGE.set(page) 進(jìn)行設(shè)置,從而在分頁插件中可以獲取到這個(gè)本地變量對象中的參數(shù)進(jìn)行 SQL 的改寫,由于改寫有很多實(shí)現(xiàn),我們這里用的Mysql的實(shí)現(xiàn):

在這里插入圖片描述

 在這里我們會發(fā)現(xiàn)分頁插件改寫SQL的核心代碼,這個(gè)代碼就很清晰了,不必過多贅述:

public String getPageSql(String sql, Page page, CacheKey pageKey) {
        StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
        sqlBuilder.append(sql);
        if (page.getStartRow() == 0) {
            sqlBuilder.append(" LIMIT ");
            sqlBuilder.append(page.getPageSize());
        } else {
            sqlBuilder.append(" LIMIT ");
            sqlBuilder.append(page.getStartRow());
            sqlBuilder.append(",");
            sqlBuilder.append(page.getPageSize());
            pageKey.update(page.getStartRow());
        }

        pageKey.update(page.getPageSize());
        return sqlBuilder.toString();
}

PageHelper 就是這么一步一步的改寫了我們的SQL 從而達(dá)到一個(gè)分頁的效果。
關(guān)鍵類總結(jié):
  

在這里插入圖片描述

7.2 MyBatis逆向工程

引入pom依賴

<dependency>
   <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.4.0</version>
</dependency>

編寫配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
<!-- 指定數(shù)據(jù)庫驅(qū)動
	用java代碼的方式生成可以不指定(只需要吧mybatis-generator和數(shù)據(jù)庫驅(qū)動依賴到項(xiàng)目)

  <classPathEntry location ="F:\java\jar\mysql-connector-java-5.1.22-bin.jar" /> -->
  
  <!-- targetRuntime
  	MyBatis3  可以生成通用查詢,可以指定動態(tài)where條件
    MyBatis3Simple 只生成CURD
   -->
  <context id="DB2Tables" targetRuntime="MyBatis3">
  
  <!-- 關(guān)于注釋的生成規(guī)則 -->
	<commentGenerator>
	<!-- 設(shè)置不生成注釋 -->
		<property name="suppressAllComments" value="true"/>
	</commentGenerator>
	
  <!-- 數(shù)據(jù)庫的連接信息 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/bookstore"
        userId="root"
        password="root">
    </jdbcConnection>

<!-- java類型生成方式 -->
    <javaTypeResolver >
    <!-- forceBigDecimals 
	    	true 當(dāng)數(shù)據(jù)庫類型為decimal 或number 生成對應(yīng)的java的BigDecimal
	    	false 會根據(jù)可數(shù)據(jù)的數(shù)值長度生成不同的對應(yīng)java類型
	    useJSR310Types
	        false 所有數(shù)據(jù)庫的日期類型都會生成java的 Date類型	
	        true  會將數(shù)據(jù)庫的日期類型生成對應(yīng)的JSR310的日期類型
	        		比如 mysql的數(shù)據(jù)庫類型是date===>LocalDate
	        		必須jdk是1.8以上
    -->
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

	<!-- pojo的生成規(guī)則 -->
    <javaModelGenerator  
    	targetPackage="cn.tuling.pojo" targetProject="./src/main/java">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

	<!-- sql映射文件的生成規(guī)則 -->
    <sqlMapGenerator targetPackage="cn.tuling.mapper"  targetProject="./src/main/resources">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

	<!-- dao的接口生成規(guī)則 UserMapper-->
    <javaClientGenerator type="XMLMAPPER" targetPackage="cn.tuling.mapper"  targetProject="./src/main/java">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table tableName="emp" domainObjectName="Emp" mapperName="EmpMapper" ></table>
 	<table tableName="dept" domainObjectName="Dept" mapperName="DeptMapper" ></table>


  </context>
</generatorConfiguration>

編寫測試類

public class MBGTest {

    @Test
    public void test01() throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

調(diào)用

@Test
public void test01() {
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
        // Mybatis在getMapper就會給我們創(chuàng)建jdk動態(tài)代理
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

        Emp emp = mapper.selectByPrimaryKey(4);
        System.out.println(emp);
    }
}



/**
 * Mybatis3生成調(diào)用方式
 */
@Test
public void test02() {
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
        // Mybatis在getMapper就會給我們創(chuàng)建jdk動態(tài)代理
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

        // 使用Example實(shí)現(xiàn)動態(tài)條件語句
        EmpExample empExample=new EmpExample();
        EmpExample.Criteria criteria = empExample.createCriteria();
        criteria.andUserNameLike("%帥%")
                .andIdEqualTo(4);

        List<Emp> emps = mapper.selectByExample(empExample);
        System.out.println(emps);
    }
}

到此這篇關(guān)于Mybatis的介紹、基本使用、高級使用的文章就介紹到這了,更多相關(guān)Mybatis的介紹和使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java服務(wù)端微信APP支付接口詳解

    java服務(wù)端微信APP支付接口詳解

    這篇文章主要為大家詳細(xì)介紹了java服務(wù)端微信APP支付接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • MyBatis-Plus 樂觀鎖的具體實(shí)現(xiàn)

    MyBatis-Plus 樂觀鎖的具體實(shí)現(xiàn)

    MyBatis-Plus 的樂觀鎖通過簡單的配置和注解,可以輕松實(shí)現(xiàn)高并發(fā)場景下的數(shù)據(jù)并發(fā)控制,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • Java中的Apache?Commons?Math使用詳解

    Java中的Apache?Commons?Math使用詳解

    Java中的Apache?Commons?Math是一個(gè)開源的數(shù)學(xué)庫,它提供了許多常用的數(shù)學(xué)函數(shù)和算法,這個(gè)庫對于需要處理大量數(shù)據(jù)的開發(fā)者來說非常有用,因?yàn)樗梢源蟠蠛喕a并提高效率,本文給大家詳解講解Java中的Apache?Commons?Math知識,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • SpringBoot+RabbitMq具體使用的幾種姿勢

    SpringBoot+RabbitMq具體使用的幾種姿勢

    這篇文章主要介紹了SpringBoot+RabbitMq具體使用的幾種姿勢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 一文解決springboot打包成jar文件無法正常運(yùn)行的問題

    一文解決springboot打包成jar文件無法正常運(yùn)行的問題

    這篇文章主要介紹了一文解決springboot打包成jar文件無法正常運(yùn)行的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JVM核心教程之JVM運(yùn)行與類加載全過程詳解

    JVM核心教程之JVM運(yùn)行與類加載全過程詳解

    我們都知道一個(gè)java程序運(yùn)行要經(jīng)過編譯和執(zhí)行,但是這太概括了,中間還有很多步驟,下面這篇文章主要給大家介紹了關(guān)于JVM核心教程之JVM運(yùn)行與類加載全過程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-04-04
  • SpringBoot集成WebSocket實(shí)現(xiàn)后臺向前端推送信息的示例

    SpringBoot集成WebSocket實(shí)現(xiàn)后臺向前端推送信息的示例

    這篇文章主要介紹了SpringBoot集成WebSocket實(shí)現(xiàn)后臺向前端推送信息的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java實(shí)現(xiàn)辦公文檔在線預(yù)覽功能

    Java實(shí)現(xiàn)辦公文檔在線預(yù)覽功能

    java實(shí)現(xiàn)辦公文件在線預(yù)覽功能是一個(gè)大家在工作中也許會遇到的需求,這篇文章就教大家如何實(shí)現(xiàn)這一功能,感興趣的小伙伴可以了解一下
    2021-12-12
  • Maven版本依賴pom文件內(nèi)容及使用剖析

    Maven版本依賴pom文件內(nèi)容及使用剖析

    這篇文章主要為大家介紹了Maven版本依賴pom文件內(nèi)容及使用剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java中instanceof 關(guān)鍵字的使用

    Java中instanceof 關(guān)鍵字的使用

    instanceof通過返回一個(gè)布爾值來指出,某個(gè)對象是否是某個(gè)特定類或者是該特定類的子類的一個(gè)實(shí)例,本文就來詳細(xì)的介紹一下instanceof 關(guān)鍵字的使用,感興趣的可以了解一下
    2023-10-10

最新評論

福利午夜视频在线观看| 国产janese在线播放| 国产成人综合一区2区| 国产精彩福利精品视频| 激情五月婷婷免费视频| 做爰视频毛片下载蜜桃视频1| 精品成人午夜免费看| av在线免费观看亚洲天堂| 这里只有精品双飞在线播放| 精品黑人一区二区三区久久国产| 一区二区麻豆传媒黄片| 天天干夜夜操啊啊啊| 插小穴高清无码中文字幕| 免费人成黄页网站在线观看国产| 91精品国产黑色丝袜| 免费看国产又粗又猛又爽又黄视频| 日本熟女50视频免费| 久久尻中国美女视频| 国产亚洲精品视频合集| 黑人性生活视频免费看| 久草免费人妻视频在线| 66久久久久久久久久久| 少妇人妻久久久久视频黄片| 免费观看成年人视频在线观看| 久碰精品少妇中文字幕av| 国产一区成人在线观看视频| 岛国av高清在线成人在线| av手机在线观播放网站| 91精品激情五月婷婷在线| 精品国产乱码一区二区三区乱| 一区二区三区 自拍偷拍| 在线观看的黄色免费网站| 香蕉片在线观看av| 天天插天天狠天天操| 一区二区三区视频,福利一区二区 丰满的子国产在线观看 | 久久精品久久精品亚洲人| 91九色porny国产蝌蚪视频| 精品国产高潮中文字幕| 99国产精品窥熟女精品| 午夜成午夜成年片在线观看| 一区二区三区日韩久久| 欧美一区二区三区高清不卡tv| 国产之丝袜脚在线一区二区三区 | 丰满的继坶3中文在线观看| 好吊视频—区二区三区| 国产老熟女伦老熟妇ⅹ| av老司机精品在线观看| 硬鸡巴动态操女人逼视频| 欧美xxx成人在线| 青娱乐蜜桃臀av色| 亚洲av人人澡人人爽人人爱| 亚洲偷自拍高清视频| 在线观看911精品国产| 中文字幕一区二区自拍| 粉嫩小穴流水视频在线观看| 国产janese在线播放| 精品一区二区亚洲欧美| 男女啪啪视频免费在线观看| 国产精品久久9999| 中国无遮挡白丝袜二区精品| 中文字幕日韩精品就在这里| 大鸡吧插入女阴道黄色片| 99热国产精品666| 亚洲公开视频在线观看| 国产精品入口麻豆啊啊啊| 欧美精品免费aaaaaa| 黄工厂精品视频在线观看| 偷拍自拍福利视频在线观看| 国产九色91在线观看精品| 视频一区二区综合精品| 婷婷综合亚洲爱久久| ka0ri在线视频| 老鸭窝日韩精品视频观看| 亚洲区欧美区另类最新章节| 国际av大片在线免费观看| 强行扒开双腿猛烈进入免费版| 青青草原色片网站在线观看| 春色激情网欧美成人| 中文字幕高清资源站| 亚洲第一伊人天堂网| 亚洲 自拍 色综合图| 中文字幕高清免费在线人妻| 五月激情婷婷久久综合网| 久草视频在线一区二区三区资源站| v888av在线观看视频| 天天干天天日天天谢综合156| 懂色av蜜桃a v| 日韩三级电影华丽的外出| 韩国女主播精品视频网站| 亚洲一区二区三区uij| 97瑟瑟超碰在线香蕉| 亚洲黄色av网站免费播放| 亚洲自拍偷拍综合色| 男生用鸡操女生视频动漫| 一级黄色片夫妻性生活| 91麻豆精品传媒国产黄色片| 男人的天堂一区二区在线观看| 色综合久久五月色婷婷综合| 亚洲欧美综合在线探花| gav成人免费播放| 在线免费观看国产精品黄色| 97年大学生大白天操逼| 亚洲成人国产av在线| avjpm亚洲伊人久久| 国产1区,2区,3区| 中文字幕乱码人妻电影| 中文字幕人妻av在线观看| 国产在线免费观看成人| 男人的天堂在线黄色| 骚逼被大屌狂草视频免费看| 福利视频网久久91| 久久这里只有精彩视频免费| 精品国产高潮中文字幕| 91老师蜜桃臀大屁股| 国产免费高清视频视频| 91久久综合男人天堂| 四川乱子伦视频国产vip| 国产丰满熟女成人视频| 99一区二区在线观看| 国产白袜脚足J棉袜在线观看| 91免费观看在线网站| 亚洲天堂精品久久久| 亚洲激情,偷拍视频| 91极品新人『兔兔』精品新作 | 天天插天天狠天天操| 啊啊啊视频试看人妻| 密臀av一区在线观看| av天堂加勒比在线| 久久久久久9999久久久久| 国产福利小视频大全| 日韩av大胆在线观看| 久久久久只精品国产三级| 最新日韩av传媒在线| 91精品国产黑色丝袜| 天天日天天操天天摸天天舔| 夜色福利视频在线观看| 中文字日产幕乱六区蜜桃| av俺也去在线播放| 亚洲欧美国产综合777| 少妇一区二区三区久久久| 欧美亚洲国产成人免费在线| 亚洲欧美激情国产综合久久久 | 亚国产成人精品久久久| 精品久久久久久久久久久99| 自拍偷拍一区二区三区图片| 91she九色精品国产| 日本美女性生活一级片| 涩涩的视频在线观看视频| 国产成人一区二区三区电影网站| 日本后入视频在线观看| 一区二区视频在线观看视频在线| h国产小视频福利在线观看| 人人爱人人妻人人澡39| 色伦色伦777国产精品| 黄色的网站在线免费看 | 国产精品成人xxxx| 国产又色又刺激在线视频| 91中文字幕免费在线观看| 亚洲中文字字幕乱码| 国产亚洲视频在线观看| 熟女国产一区亚洲中文字幕| 国产无遮挡裸体免费直播视频| 男人天堂色男人av| 亚洲综合乱码一区二区| 少妇被强干到高潮视频在线观看 | 沙月文乃人妻侵犯中文字幕在线 | 亚洲国产精品黑丝美女| 不卡日韩av在线观看| 人人人妻人人澡人人| 特一级特级黄色网片| 色哟哟在线网站入口| 亚洲综合另类欧美久久| 人妻av无码专区久久绿巨人| 日本后入视频在线观看| 男人操女人的逼免费视频| 亚洲精品在线资源站| 午夜精品一区二区三区更新| 97少妇精品在线观看| 少妇与子乱在线观看| 啊用力插好舒服视频| 性色av一区二区三区久久久| 男人操女人逼逼视频网站| 亚洲最大免费在线观看| 摧残蹂躏av一二三区| 国产自拍黄片在线观看| 亚洲熟妇无码一区二区三区| 中文字幕中文字幕人妻| av无限看熟女人妻另类av| 国产成人小视频在线观看无遮挡| 99精品视频在线观看免费播放| 国产视频网站国产视频| 青青青青青手机视频| 国产午夜激情福利小视频在线| 欧美特色aaa大片| 在线观看av观看av| 晚上一个人看操B片| 天天日天天干天天搡| 青青青青操在线观看免费| 国产一区av澳门在线观看| 欧美黄色录像免费看的| 久久久久只精品国产三级| 少妇人妻二三区视频| 三上悠亚和黑人665番号| 97欧洲一区二区精品免费 | 日韩特级黄片高清在线看| 黄页网视频在线免费观看| 搡老熟女一区二区在线观看| 日本一二三区不卡无| 日比视频老公慢点好舒服啊| 日本av熟女在线视频| 中文字幕之无码色多多| 蜜桃臀av蜜桃臀av| 日日爽天天干夜夜操| 精品老妇女久久9g国产| 欧美亚洲自偷自拍 在线| 国产在线免费观看成人| 日本脱亚入欧是指什么| 日比视频老公慢点好舒服啊| 男生用鸡操女生视频动漫| 久草极品美女视频在线观看| 极品性荡少妇一区二区色欲| 一区二区三区激情在线| 二区中出在线观看老师| 男人的网址你懂的亚洲欧洲av| 国产精品福利小视频a| 亚洲国产成人无码麻豆艾秋| 欧美日韩亚洲国产无线码| 亚洲第一伊人天堂网| 超级福利视频在线观看| 国产成人精品一区在线观看| 韩国三级aaaaa高清视频| 日本女人一级免费片| 在线国产日韩欧美视频| 久久www免费人成一看片| 成人久久精品一区二区三区| 美女福利视频网址导航| 亚洲狠狠婷婷综合久久app | 天天日天天干天天要| 91香蕉成人app下载| 亚洲无码一区在线影院| 国产在线91观看免费观看| 一区二区视频视频视频| 青草久久视频在线观看| gay gay男男瑟瑟在线网站| 日韩欧美国产一区不卡| 天天操天天干天天艹| 专门看国产熟妇的网站| 午夜免费体验区在线观看| 亚洲一区二区久久久人妻| 91在线视频在线精品3| 日本少妇人妻xxxxxhd| 亚洲欧美久久久久久久久| 亚洲综合乱码一区二区| 欧美精品资源在线观看| 日韩欧美国产精品91| 揄拍成人国产精品免费看视频| 污污小视频91在线观看| 国产第一美女一区二区三区四区| 啊啊啊想要被插进去视频| 亚洲综合乱码一区二区| 中文人妻AV久久人妻水| 极品丝袜一区二区三区| 在线不卡日韩视频播放| 青青青激情在线观看视频| 中出中文字幕在线观看| 欧美精品免费aaaaaa| 绝顶痉挛大潮喷高潮无码| 深夜男人福利在线观看| 一色桃子久久精品亚洲| 1区2区3区不卡视频| 中文字幕在线一区精品| 一级黄片大鸡巴插入美女| 天天干天天啪天天舔| 一区二区在线观看少妇| 一个色综合男人天堂| 日韩av中文在线免费观看| 欧美亚洲一二三区蜜臀| 午夜精品一区二区三区更新| 国产精品自拍偷拍a| 欧美一区二区三区在线资源| 亚洲蜜臀av一区二区三区九色 | 伊人网中文字幕在线视频| 瑟瑟视频在线观看免费视频| 91大神福利视频网| 少妇露脸深喉口爆吞精| 欧美精品中文字幕久久二区| av新中文天堂在线网址| 93人妻人人揉人人澡人人| 久久久久久性虐视频| 国产在线观看黄色视频| 97青青青手机在线视频| 天天干天天搞天天摸| 日本男女操逼视频免费看| 久久久久久久精品老熟妇| 亚洲成人三级在线播放| 极品粉嫩小泬白浆20p主播| 九色视频在线观看免费| 93精品视频在线观看| 精品国产污污免费网站入口自| 99精品视频在线观看免费播放| 中文字幕高清在线免费播放| 国产乱弄免费视频观看| 中文字幕成人日韩欧美| 国产中文精品在线观看| 日本在线不卡免费视频| 青青青青草手机在线视频免费看| 婷婷综合蜜桃av在线| 国产又粗又硬又大视频| 狍和女人的王色毛片| 日噜噜噜夜夜噜噜噜天天噜噜噜| 亚洲av自拍偷拍综合| 可以免费看的www视频你懂的| 色97视频在线播放| 91中文字幕最新合集| 不卡日韩av在线观看| av在线免费观看亚洲天堂| 阿v天堂2014 一区亚洲| av视网站在线观看| 亚洲1区2区3区精华液| free性日本少妇| 色呦呦视频在线观看视频| 337p日本大胆欧美人| av网址国产在线观看| 伊人精品福利综合导航| 久久精品国产23696| 欧美3p在线观看一区二区三区| 亚洲精品一区二区三区老狼| 1区2区3区不卡视频| 国产视频网站国产视频| 97瑟瑟超碰在线香蕉| 亚洲最大黄了色网站| 天天操天天爽天天干| 任你操视频免费在线观看| 天天操夜夜操天天操天天操| av老司机亚洲一区二区| 亚洲丝袜老师诱惑在线观看| 2021久久免费视频| 亚洲成人熟妇一区二区三区 | 91国偷自产一区二区三区精品| 一区二区三区四区五区性感视频| 国产在线观看黄色视频| 国产一区二区火爆视频| 中文字幕午夜免费福利视频| caoporm超碰国产| 欧美黑人巨大性xxxxx猛交| 成熟丰满熟妇高潮xx×xx | 婷婷五月亚洲综合在线| 人妻3p真实偷拍一二区| 全国亚洲男人的天堂| 播放日本一区二区三区电影 | 中国产一级黄片免费视频播放| 日韩中文字幕福利av| 天天草天天色天天干| 久久精品在线观看一区二区| 又色又爽又黄的美女裸体| 五十路熟女人妻一区二区9933| 亚洲一级av大片免费观看| 国产女人叫床高潮大片视频| 一区二区三区激情在线| 99婷婷在线观看视频| av乱码一区二区三区| 亚洲天堂精品久久久| 国产精品精品精品999| 38av一区二区三区| 福利在线视频网址导航| 五色婷婷综合狠狠爱| 亚洲1区2区3区精华液| 国产在线观看黄色视频| 在线免费观看日本片| 91免费黄片可看视频| 日日夜夜精品一二三| 一区二区视频视频视频| 视频在线免费观看你懂得| 国产乱弄免费视频观看| 亚洲综合图片20p| 精品亚洲国产中文自在线| 天天操夜夜骑日日摸| 91小伙伴中女熟女高潮| 99re6热在线精品| 国产综合精品久久久久蜜臀| 97超碰国语国产97超碰| 成年美女黄网站18禁久久| 亚洲av香蕉一区区二区三区犇| av成人在线观看一区| 亚洲av可乐操首页| 亚洲一区久久免费视频| 内射久久久久综合网| 中英文字幕av一区| 好太好爽好想要免费| 丰满少妇翘臀后进式| 日韩欧美国产精品91| 成人午夜电影在线观看 久久| 国产1区,2区,3区| 亚洲图库另类图片区| 北条麻妃高跟丝袜啪啪| 人妻少妇一区二区三区蜜桃| 中文字幕视频一区二区在线观看| 精产国品久久一二三产区区别| 国产高清精品一区二区三区| 日本性感美女写真视频| 青青青青青青青青青青草青青| 不卡精品视频在线观看| 久草视频在线看免费| 亚洲日本一区二区三区| 91免费福利网91麻豆国产精品| 超黄超污网站在线观看| a v欧美一区=区三区| 五月精品丁香久久久久福利社| 2020中文字幕在线播放| 动漫美女的小穴视频| 天天日天天干天天插舔舔| 国产一区二区神马久久| 亚洲在线免费h观看网站| 欧美色呦呦最新网址| 国产精品久久久久久久久福交 | 免费观看污视频网站| 日本人妻欲求不满中文字幕| 国产熟妇一区二区三区av | 特大黑人巨大xxxx| 国产日本精品久久久久久久| 一区二区视频视频视频| 国产三级片久久久久久久 | 成年人啪啪视频在线观看| 丝袜美腿视频诱惑亚洲无| 边摸边做超爽毛片18禁色戒 | 成人av久久精品一区二区| 自拍偷拍日韩欧美一区二区| 93精品视频在线观看| 天天日天天干天天插舔舔| 天天插天天色天天日| 可以免费看的www视频你懂的| 92福利视频午夜1000看 | 2o22av在线视频| 任我爽精品视频在线播放| 国产白嫩美女一区二区| 天堂v男人视频在线观看| 国产内射中出在线观看| 99久久久无码国产精品性出奶水| 91精品国产91青青碰| 99视频精品全部15| 日本黄色三级高清视频| 欧美视频不卡一区四区| 亚洲熟妇x久久av久久| 日本熟女50视频免费| mm131美女午夜爽爽爽| 国产成人无码精品久久久电影 | 2021天天色天天干| 黑人巨大精品欧美视频| 亚洲成人激情视频免费观看了| 91快播视频在线观看| 欧美亚洲中文字幕一区二区三区| 一区二区三区日韩久久| 女同性ⅹxx女同hd| 国产中文精品在线观看| 天堂女人av一区二区| 九九视频在线精品播放| 人妻无码中文字幕专区| 欧美伊人久久大香线蕉综合| 9久在线视频只有精品| 性欧美日本大妈母与子| 欧美男人大鸡吧插女人视频| 五色婷婷综合狠狠爱| 91福利视频免费在线观看| 99精品免费久久久久久久久a| 亚洲欧美一区二区三区电影| 日韩精品一区二区三区在线播放| 91社福利《在线观看| 福利视频一区二区三区筱慧| 丝袜肉丝一区二区三区四区在线| 不卡日韩av在线观看| 午夜国产免费福利av| 亚洲午夜在线视频福利| 18禁免费av网站| 一区二区麻豆传媒黄片| 少妇人妻真实精品视频| 免费人成黄页网站在线观看国产| 黄片三级三级三级在线观看| 东游记中文字幕版哪里可以看到| 在线观看成人国产电影| 亚洲欧美成人综合在线观看| 日韩激情文学在线视频| 一区二区三区四区五区性感视频| 亚洲av日韩av第一区二区三区| 福利视频一区二区三区筱慧| 国产麻豆剧传媒精品国产av蜜桃| 国产极品美女久久久久久| 亚洲欧美福利在线观看| 国产精品午夜国产小视频| 免费黄色成人午夜在线网站| 国产黄色高清资源在线免费观看| 欧美成一区二区三区四区| 一二三区在线观看视频| av在线免费中文字幕| 中文字幕1卡1区2区3区| 亚洲码av无色中文| xxx日本hd高清| 久久久噜噜噜久久熟女av| 亚洲午夜伦理视频在线| 在线观看的黄色免费网站| 日日日日日日日日夜夜夜夜夜夜| 综合激情网激情五月五月婷婷| 天天干天天操天天插天天日| 天天操天天干天天日狠狠插 | 欧美中文字幕一区最新网址| 2022中文字幕在线| 亚洲人成精品久久久久久久| 好男人视频在线免费观看网站| 亚洲欧美综合另类13p| 在线免费观看99视频| 久久亚洲天堂中文对白| 在线免费观看视频一二区| avjpm亚洲伊人久久| 午夜美女少妇福利视频| 亚洲自拍偷拍精品网| 国产aⅴ一线在线观看| av线天堂在线观看| 国产刺激激情美女网站| 肏插流水妹子在线乐播下载| 偷拍自拍亚洲视频在线观看| aiss午夜免费视频| 成年午夜影片国产片| 超黄超污网站在线观看| 国产精品大陆在线2019不卡| 日韩欧美亚洲熟女人妻| 91成人精品亚洲国产| 农村胖女人操逼视频| 国产九色91在线视频| 国产九色91在线观看精品| 日韩近亲视频在线观看| 亚洲综合乱码一区二区| 午夜精彩视频免费一区| 久久这里有免费精品| av老司机亚洲一区二区| 在线免费观看日本片| 久久午夜夜伦痒痒想咳嗽P| 99热久久这里只有精品8| 国产+亚洲+欧美+另类| 久久久噜噜噜久久熟女av| 大鸡八强奸视频在线观看| 91九色porny国产蝌蚪视频| 99re久久这里都是精品视频| 一区二区三区蜜臀在线| 亚洲精品无码久久久久不卡| 国产又粗又硬又猛的毛片视频| 中英文字幕av一区| 免费看美女脱光衣服的视频| 青青青青青青青青青青草青青 | 摧残蹂躏av一二三区| av资源中文字幕在线观看| 丰满的子国产在线观看| 和邻居少妇愉情中文字幕| 国产欧美精品免费观看视频| 女同性ⅹxx女同hd| 狠狠地躁夜夜躁日日躁| 男大肉棒猛烈插女免费视频| 天天干天天插天天谢| 黄色成年网站午夜在线观看| 日本福利午夜电影在线观看| 绝色少妇高潮3在线观看| 久久久久久久一区二区三| 大屁股肉感人妻中文字幕在线| 亚洲免费福利一区二区三区| 天天日天天添天天爽| 经典国语激情内射视频| 又大又湿又爽又紧A视频| 我想看操逼黄色大片| 91九色国产porny蝌蚪| 国产亚洲天堂天天一区| 女同性ⅹxx女同h偷拍| 水蜜桃国产一区二区三区| 春色激情网欧美成人| 视频在线免费观看你懂得| 99视频精品全部15| 中文字幕无码一区二区免费| 国产老熟女伦老熟妇ⅹ| 久久久久91精品推荐99| 亚洲国产精品免费在线观看| 国产熟妇人妻ⅹxxxx麻豆| 手机看片福利盒子日韩在线播放| 久久艹在线观看视频| 曰本无码人妻丰满熟妇啪啪| 亚洲av无乱一区二区三区性色| 欧美爆乳肉感大码在线观看| 亚洲一区久久免费视频| 黄色无码鸡吧操逼视频| okirakuhuhu在线观看| 91啪国自产中文字幕在线| 一区二区三区美女毛片| 久草视频 久草视频2| 亚洲 清纯 国产com| 国产成人精品av网站| 亚洲日本一区二区三区| 一级黄片久久久久久久久| 绯色av蜜臀vs少妇| 男生用鸡操女生视频动漫| 国产精品久久久久网| 精品黑人一区二区三区久久国产| 丝袜长腿第一页在线| 欧美中国日韩久久精品| 国产亚洲天堂天天一区| 亚洲日本一区二区三区| 国产福利小视频大全| 国产日韩av一区二区在线| 国产熟妇人妻ⅹxxxx麻豆| 美女在线观看日本亚洲一区| 可以在线观看的av中文字幕| 久久久久久久精品成人热| wwwxxx一级黄色片| 亚洲va欧美va人人爽3p| 欧美精品资源在线观看| 少妇人妻100系列| 一区二区三区四区五区性感视频| 久久艹在线观看视频| 婷婷激情四射在线观看视频| 国产高清在线观看1区2区| 亚洲熟妇无码一区二区三区| 成人免费做爰高潮视频| av一区二区三区人妻| ka0ri在线视频| 熟女俱乐部一二三区| 91超碰青青中文字幕| 成人sm视频在线观看| 亚洲国产欧美一区二区三区…| 91精品高清一区二区三区| 蜜桃专区一区二区在线观看| 久久一区二区三区人妻欧美| 青青草亚洲国产精品视频| 国产福利小视频二区| 青春草视频在线免费播放| 国产精品国产三级麻豆| 天天日天天干天天舔天天射| 国产美女精品福利在线| 国产麻豆剧传媒精品国产av蜜桃| 国产在线自在拍91国语自产精品| 日本一区二区三区免费小视频| 精品一区二区三四区| 午夜美女少妇福利视频| 一区二区三区美女毛片| 嫩草aⅴ一区二区三区| 九色精品视频在线播放| 精品乱子伦一区二区三区免费播| 亚洲熟女综合色一区二区三区四区| 日本高清撒尿pissing| 欧美乱妇无乱码一区二区| 93精品视频在线观看| 亚洲av色图18p| 精品成人啪啪18免费蜜臀| www骚国产精品视频| 日本人妻少妇18—xx| 国产亚洲欧美另类在线观看| 大鸡吧插逼逼视频免费看| 中文字幕午夜免费福利视频| 偷拍自拍福利视频在线观看| mm131美女午夜爽爽爽| 特黄老太婆aa毛毛片| 亚洲美女自偷自拍11页| 国产性色生活片毛片春晓精品| 四川乱子伦视频国产vip| 亚洲青青操骚货在线视频| 岛国青草视频在线观看| 婷婷激情四射在线观看视频| 日韩欧美制服诱惑一区在线| 肏插流水妹子在线乐播下载| 一区二区三区 自拍偷拍| 欧美日韩情色在线观看| 中文字幕在线欧美精品| 亚洲综合另类精品小说| 成人av电影免费版| 亚洲精品乱码久久久本| 青草亚洲视频在线观看| 欧美在线精品一区二区三区视频 | huangse网站在线观看| 成人国产小视频在线观看| weyvv5国产成人精品的视频| 91一区精品在线观看| 伊人情人综合成人久久网小说| 中文字幕第一页国产在线| 青青擦在线视频国产在线| 午夜精品在线视频一区| 国产在线观看黄色视频| 久精品人妻一区二区三区 | av一区二区三区人妻| 久久精品国产999| 黄色的网站在线免费看| 亚洲伊人色一综合网| 国产av国片精品一区二区| 亚洲日本一区二区久久久精品| 五色婷婷综合狠狠爱| 精品91自产拍在线观看一区| 自拍偷拍日韩欧美亚洲| 色婷婷六月亚洲综合香蕉| 香蕉91一区二区三区| 久草免费人妻视频在线| 粗大的内捧猛烈进出爽大牛汉子| 亚洲视频在线视频看视频在线| 国产乱子伦精品视频潮优女| 国产97在线视频观看| 一区二区视频视频视频| 成人sm视频在线观看| 五色婷婷综合狠狠爱| 色秀欧美视频第一页| 国产黄色片在线收看| 人妻另类专区欧美制服| 九色精品视频在线播放| 久久精品亚洲成在人线a| 国产黄色a级三级三级三级| 天天日天天舔天天射进去| 大肉大捧一进一出好爽在线视频| 人妻熟女在线一区二区 | 十八禁在线观看地址免费| 亚洲少妇高潮免费观看| 北条麻妃高跟丝袜啪啪| 开心 色 六月 婷婷| 国产精品自拍在线视频| 亚洲最大免费在线观看| 最新日韩av传媒在线| 91精品国产91久久自产久强| 伊人成人在线综合网| 亚洲男人让女人爽的视频| 91麻豆精品传媒国产黄色片| 欧美va亚洲va天堂va| 中文字幕熟女人妻久久久| 绝顶痉挛大潮喷高潮无码| 18禁美女羞羞免费网站| 日韩欧美中文国产在线| 欧美视频中文一区二区三区| 免费啪啪啪在线观看视频| 大鸡巴插入美女黑黑的阴毛| 大屁股肉感人妻中文字幕在线| 久草视频在线一区二区三区资源站| 亚洲熟妇x久久av久久| 日本熟女精品一区二区三区| yy96视频在线观看| 在线观看911精品国产| 欧美日韩人妻久久精品高清国产| 中文字幕高清在线免费播放| 大鸡巴后入爆操大屁股美女| 天堂av在线官网中文| 日韩成人免费电影二区| 好吊视频—区二区三区| 久青青草视频手机在线免费观看| 中文字幕午夜免费福利视频| 在线观看视频网站麻豆| 国产日本欧美亚洲精品视| av中文字幕在线观看第三页| 东京干手机福利视频| 懂色av蜜桃a v| 天天干夜夜操天天舔| 清纯美女在线观看国产| 成人av亚洲一区二区| 亚洲va天堂va国产va久| 中文字幕在线视频一区二区三区| 亚洲综合在线观看免费| 天天日天天干天天插舔舔| 夜色17s精品人妻熟女| 福利在线视频网址导航| 适合午夜一个人看的视频| 激情人妻校园春色亚洲欧美| 久久精品在线观看一区二区| 一区二区三区四区视频| 久草视频在线一区二区三区资源站| 天天艹天天干天天操| 中文字幕乱码人妻电影| 国产福利小视频大全| 最新的中文字幕 亚洲| 91麻豆精品传媒国产黄色片| 五十路熟女人妻一区二区9933 | 99热这里只有国产精品6| 韩国AV无码不卡在线播放| 精品黑人一区二区三区久久国产| 国产精品午夜国产小视频| 亚洲 欧美 精品 激情 偷拍| 最新中文字幕免费视频| 熟女少妇激情五十路| av高潮迭起在线观看| 在线观看911精品国产| 亚洲精品一区二区三区老狼| 欧美成人综合色在线噜噜| 肏插流水妹子在线乐播下载| 国内资源最丰富的网站| 日韩激情文学在线视频| 91色秘乱一区二区三区| 欧美日韩v中文在线| 一区二区三区国产精选在线播放| 国产V亚洲V天堂无码欠欠| 最新97国产在线视频| 国产日韩精品电影7777| 亚洲国产在线精品国偷产拍| 国产一区自拍黄视频免费观看| 午夜福利人人妻人人澡人人爽| lutube在线成人免费看| 美洲精品一二三产区区别| 成人30分钟免费视频| 97小视频人妻一区二区| 亚洲激情唯美亚洲激情图片| 日美女屁股黄邑视频| 亚洲成a人片777777| 快插进小逼里大鸡吧视频| 9色精品视频在线观看| xxx日本hd高清| 欧美黄色录像免费看的| 日韩精品电影亚洲一区| 99av国产精品欲麻豆| 国产欧美日韩在线观看不卡| 人妻少妇一区二区三区蜜桃| 中文乱理伦片在线观看| 欧美成人综合视频一区二区 | 色综合久久五月色婷婷综合| 亚洲午夜电影之麻豆| 早川濑里奈av黑人番号| 天天日天天干天天搡| 在线观看操大逼视频| 欧美精品激情在线最新观看视频 | 超级碰碰在线视频免费观看| 亚洲精品麻豆免费在线观看| 97超碰免费在线视频| 熟女在线视频一区二区三区| 传媒在线播放国产精品一区| 一级黄色片夫妻性生活| 在线免费观看99视频| 日韩av熟妇在线观看| 精品国产乱码一区二区三区乱| 老司机午夜精品视频资源| 亚洲国产美女一区二区三区软件| 成人高清在线观看视频| 中文字幕欧美日韩射射一| 欧美一区二区三区乱码在线播放| 亚洲一区二区三区五区| 福利在线视频网址导航| 天天操夜夜操天天操天天操| 欧美性感尤物人妻在线免费看| 亚洲av色香蕉一区二区三区| 一区国内二区日韩三区欧美| 欧美专区日韩专区国产专区| 欧美久久久久久三级网| 国产黄色大片在线免费播放| 亚洲国际青青操综合网站| 人妻少妇一区二区三区蜜桃| 国产精品熟女久久久久浪潮| 国产麻豆国语对白露脸剧情 | 玩弄人妻熟妇性色av少妇| 国内资源最丰富的网站| 亚洲在线免费h观看网站| 欧美成人黄片一区二区三区| 丝袜美腿视频诱惑亚洲无| 色偷偷伊人大杳蕉综合网| 一区二区三区国产精选在线播放| 日本免费午夜视频网站| 国产污污污污网站在线| 97少妇精品在线观看| 啊啊好大好爽啊啊操我啊啊视频 | 国产精品中文av在线播放| yellow在线播放av啊啊啊| 中国熟女一区二区性xx| 成人30分钟免费视频| 夜色撩人久久7777| 成人在线欧美日韩国产| 五十路熟女av天堂| 中文字幕人妻被公上司喝醉在线| 经典亚洲伊人第一页| 人妻无码中文字幕专区| 精产国品久久一二三产区区别| 亚洲熟女久久久36d| 一区二区三区视频,福利一区二区| 天天日天天鲁天天操| 人妻凌辱欧美丰满熟妇| 国产综合精品久久久久蜜臀| 欧美女同性恋免费a| 亚洲最大黄了色网站| 日日操综合成人av| 国产黄网站在线观看播放| av资源中文字幕在线观看| 国产一区二区欧美三区| 天堂av在线官网中文| 中文字幕日韩精品就在这里| 青青青青青青青青青国产精品视频| 国产自拍在线观看成人| 亚洲午夜福利中文乱码字幕| 久久永久免费精品人妻专区| 非洲黑人一级特黄片| 天天日天天日天天射天天干 | 无码日韩人妻精品久久| 精品美女福利在线观看| 国产在线一区二区三区麻酥酥| 一区二区视频视频视频| 激情国产小视频在线| 色综合久久久久久久久中文| 中文字幕亚洲久久久| 午夜毛片不卡在线看| 午夜成午夜成年片在线观看| 熟女人妻在线观看视频| 阿v天堂2014 一区亚洲| 综合色区亚洲熟妇shxstz| 操日韩美女视频在线免费看| 国产精品人妻一区二区三区网站| 青娱乐蜜桃臀av色| av高潮迭起在线观看| 国产成人综合一区2区| 精品美女久久久久久| av森泽佳奈在线观看| 搡老妇人老女人老熟女| 欧美aa一级一区三区四区| 在线视频自拍第三页| 2018最新中文字幕在线观看| 熟女人妻一区二区精品视频| 日韩av大胆在线观看| av亚洲中文天堂字幕网| 精品一区二区三四区| 丰满的子国产在线观看| 玩弄人妻熟妇性色av少妇| 制服丝袜在线人妻中文字幕| 久久国产精品精品美女| 91片黄在线观看喷潮| 国产精品久久久久国产三级试频| jul—619中文字幕在线| 精品国产亚洲av一淫| 久久久久久久精品老熟妇| 免费成人va在线观看| 91免费观看在线网站| 班长撕开乳罩揉我胸好爽| 淫秽激情视频免费观看| 男人的天堂在线黄色| 亚洲av无码成人精品区辽| 免费av岛国天堂网站| 精品美女在线观看视频在线观看| 人妻素人精油按摩中出| 日本少妇人妻xxxxx18| 亚洲人妻av毛片在线| 免费成人av中文字幕| 中文字幕一区二区亚洲一区| 91色秘乱一区二区三区| 亚洲精品久久综合久| 99热这里只有国产精品6| 亚洲推理片免费看网站| 男女啪啪视频免费在线观看| 亚洲少妇高潮免费观看| 5528327男人天堂| 国产欧美日韩第三页| 大鸡吧插逼逼视频免费看| 中文字幕网站你懂的| 日本人妻欲求不满中文字幕| 成人综合亚洲欧美一区| 欧美亚洲国产成人免费在线| 爱有来生高清在线中文字幕| 最新欧美一二三视频| 性欧美激情久久久久久久| 日本一区精品视频在线观看| 天天操天天射天天操天天天| 1000小视频在线| 成人国产影院在线观看| 免费av岛国天堂网站| 18禁美女无遮挡免费| 91在线免费观看成人| 成人精品视频99第一页| 色97视频在线播放| 亚洲另类伦春色综合小| 久精品人妻一区二区三区| av天堂中文字幕最新| 97成人免费在线观看网站| 一个人免费在线观看ww视频| 日本韩国免费一区二区三区视频| 成人网18免费视频版国产| 亚洲精品ww久久久久久| 老鸭窝日韩精品视频观看| 精品人妻一二三区久久| 阿v天堂2014 一区亚洲| 精品一区二区三区三区88| 中文字幕第1页av一天堂网| 51国产成人精品视频| 国产91嫩草久久成人在线视频| 福利视频网久久91| 国产午夜激情福利小视频在线| 天天干天天日天天谢综合156| 国产亚洲精品品视频在线| 老司机在线精品福利视频| 91中文字幕免费在线观看| 日日夜夜大香蕉伊人| 亚洲欧美人精品高清| 蜜臀av久久久久蜜臀av麻豆| 天天日天天做天天日天天做| 青青草视频手机免费在线观看| 中文字幕日韩91人妻在线| 免费一级特黄特色大片在线观看| 亚洲熟妇久久无码精品| 美女日逼视频免费观看| 97成人免费在线观看网站| 被大鸡吧操的好舒服视频免费| 国产又色又刺激在线视频| aaa久久久久久久久| 亚洲天天干 夜夜操| 懂色av蜜桃a v| 免费看美女脱光衣服的视频| 新婚人妻聚会被中出| 欧美黑人巨大性xxxxx猛交| 自拍偷拍亚洲精品第2页| 国产成人小视频在线观看无遮挡| 欧美在线精品一区二区三区视频 | 天天干夜夜操天天舔| 黄色无码鸡吧操逼视频| 班长撕开乳罩揉我胸好爽| sw137 中文字幕 在线| 中国老熟女偷拍第一页| 99久久久无码国产精品性出奶水| 熟女俱乐部一二三区| 亚洲av人人澡人人爽人人爱| 欧美日韩人妻久久精品高清国产| 免费一级特黄特色大片在线观看| 搡老熟女一区二区在线观看| 欧洲黄页网免费观看| 91亚洲手机在线视频播放| 一色桃子人妻一区二区三区| 热99re69精品8在线播放| 亚洲 中文 自拍 无码| 成人精品在线观看视频| 亚洲福利天堂久久久久久| 日本丰满熟妇BBXBBXHD| 日本午夜久久女同精女女| 黄色片黄色片wyaa| 伊人网中文字幕在线视频| 五十路熟女人妻一区二| 欧美一区二区三区乱码在线播放| 福利国产视频在线观看| 在线可以看的视频你懂的 | 视频一区 二区 三区 综合| 中文亚洲欧美日韩无线码 | chinese国产盗摄一区二区 | 新97超碰在线观看| 成人色综合中文字幕| 99精品国产aⅴ在线观看 | 国产亚洲视频在线观看| 男人天堂最新地址av| 国产精品大陆在线2019不卡| 欧美精品国产综合久久| 国产中文精品在线观看| 蜜臀成人av在线播放| 黄色成人在线中文字幕| 欧美综合婷婷欧美综合| 亚洲激情,偷拍视频| 精品国产乱码一区二区三区乱| 99久久99久国产黄毛片| 亚洲精品高清自拍av| 黑人变态深video特大巨大| 人妻激情图片视频小说| 狠狠躁狠狠爱网站视频| 精品老妇女久久9g国产| 涩爱综合久久五月蜜臀| 超碰在线观看免费在线观看| 亚洲午夜高清在线观看| 91国语爽死我了不卡| 亚洲中文精品字幕在线观看| 中文字幕在线永久免费播放| 免费在线观看污污视频网站| 欧美精产国品一二三产品价格| 欧美麻豆av在线播放| 美女小视频网站在线| 天天日天天添天天爽| 成人蜜臀午夜久久一区| 亚洲Av无码国产综合色区| 夜夜骑夜夜操夜夜奸| 99精品免费观看视频| 国产成人自拍视频在线免费观看 | 直接能看的国产av| 搞黄色在线免费观看| 91精品激情五月婷婷在线| 大屁股肉感人妻中文字幕在线| 黄网十四区丁香社区激情五月天 | 97精品人妻一区二区三区精品| 国产性感美女福利视频| 亚洲综合一区成人在线| 精品老妇女久久9g国产| 99国内精品永久免费视频| 第一福利视频在线观看| av老司机精品在线观看| 最新国产精品拍在线观看| 好太好爽好想要免费| 国产高清97在线观看视频| av中文字幕网址在线| 一区二区三区美女毛片| 国产成人综合一区2区| 国产剧情演绎系列丝袜高跟| 成人国产激情自拍三区| 免费一级特黄特色大片在线观看 | 成人福利视频免费在线| 好吊操视频这里只有精品| 黑人变态深video特大巨大| 亚洲成人三级在线播放| 中英文字幕av一区| 天天干夜夜操天天舔| 大屁股肉感人妻中文字幕在线| 午夜久久久久久久精品熟女| 欧美80老妇人性视频| 天天日天天透天天操| 日韩一区二区电国产精品| 一二三区在线观看视频| 老有所依在线观看完整版| 成年人啪啪视频在线观看| 黑人进入丰满少妇视频| 国产福利小视频二区| wwwxxx一级黄色片| 91麻豆精品91久久久久同性| 欧美亚洲偷拍自拍色图| 直接观看免费黄网站| 阿v天堂2014 一区亚洲| av在线shipin| 午夜激情高清在线观看| 欧美第一页在线免费观看视频| 中文字幕在线乱码一区二区 | 国产精品国产三级国产精东| av中文字幕网址在线| 成人H精品动漫在线无码播放| 亚洲伊人av天堂有码在线| 天天日天天干天天爱| h国产小视频福利在线观看| 欧美国产亚洲中英文字幕| 欧美成人精品欧美一级黄色| rct470中文字幕在线| av在线播放国产不卡| 男人靠女人的逼视频| 亚洲一区二区三区久久午夜| 午夜激情精品福利视频| 九九视频在线精品播放| 日韩欧美制服诱惑一区在线| 成人国产影院在线观看| 自拍偷拍,中文字幕| 中文字幕在线欧美精品| 欧美日韩在线精品一区二区三| 边摸边做超爽毛片18禁色戒| 免费在线观看视频啪啪| 特大黑人巨大xxxx| 国产白袜脚足J棉袜在线观看| 亚洲av男人的天堂你懂的| 日本黄色三级高清视频| 成年美女黄网站18禁久久| 亚洲人人妻一区二区三区| 精品欧美一区二区vr在线观看 | 精品成人啪啪18免费蜜臀| 99视频精品全部15| 在线可以看的视频你懂的 | 久久久制服丝袜中文字幕| 精品成人午夜免费看| 任你操任你干精品在线视频| 2021天天色天天干| 色综合久久久久久久久中文| 亚洲福利精品福利精品福利| 免费在线观看污污视频网站| 啊啊好大好爽啊啊操我啊啊视频| 偷拍自拍亚洲视频在线观看| 欧美精品 日韩国产| 午夜精品亚洲精品五月色| 午夜dv内射一区区| 亚洲精品乱码久久久本| 天天日天天做天天日天天做| 中文字幕AV在线免费看 | 中文字幕一区二区亚洲一区| 国产一区二区火爆视频| 国产亚洲视频在线观看| 欧美成人猛片aaaaaaa| 久久久91蜜桃精品ad| 亚洲伊人久久精品影院一美女洗澡 | 新97超碰在线观看| 日韩欧美中文国产在线| 人妻av无码专区久久绿巨人| 黄色视频在线观看高清无码| 欧美80老妇人性视频| 亚洲超碰97人人做人人爱| 亚洲av成人网在线观看| 日韩中文字幕精品淫| 不卡精品视频在线观看| 精品亚洲在线免费观看| 午夜影院在线观看视频羞羞羞| 午夜精品一区二区三区4| 91免费黄片可看视频| 欧美黄色录像免费看的| 99久久超碰人妻国产| 九一传媒制片厂视频在线免费观看 | 夏目彩春在线中文字幕| 国产刺激激情美女网站| 日韩欧美制服诱惑一区在线| 免费在线观看污污视频网站| 喷水视频在线观看这里只有精品| 蜜桃视频17c在线一区二区| 又大又湿又爽又紧A视频| 亚洲国产精品中文字幕网站| 国产中文字幕四区在线观看| 全国亚洲男人的天堂| 国产女人被做到高潮免费视频| 日日摸夜夜添夜夜添毛片性色av| 青青操免费日综合视频观看| 成人午夜电影在线观看 久久| 超碰97人人澡人人| 97国产在线av精品| 男人靠女人的逼视频| 青青草亚洲国产精品视频| 人妻无码中文字幕专区| 91福利视频免费在线观看| 91人妻精品久久久久久久网站| 精品久久久久久久久久中文蒉 | 40道精品招牌菜特色| 一级黄片大鸡巴插入美女| 中文字幕日韩91人妻在线| 午夜精品一区二区三区4| 亚洲超碰97人人做人人爱| 一个色综合男人天堂| 国产在线拍揄自揄视频网站| 最近中文2019年在线看| 综合激情网激情五月五月婷婷| 国产综合高清在线观看| 91亚洲手机在线视频播放| 三级av中文字幕在线观看| 日韩精品中文字幕在线| 青青青艹视频在线观看| www久久久久久久久久久| 亚洲无线观看国产高清在线| 精品久久久久久久久久中文蒉| 中文字幕人妻熟女在线电影| 日韩欧美在线观看不卡一区二区| 一区二区在线观看少妇| 视频一区 二区 三区 综合| 免费大片在线观看视频网站| 精品一区二区三区欧美| 综合色区亚洲熟妇shxstz| 北条麻妃av在线免费观看| 国产高清97在线观看视频| 大香蕉大香蕉大香蕉大香蕉大香蕉| 少妇露脸深喉口爆吞精| 91天堂天天日天天操| 99人妻视频免费在线| 阿v天堂2014 一区亚洲| 自拍偷拍亚洲另类色图| 成人综合亚洲欧美一区| 亚洲 清纯 国产com| 亚洲伊人久久精品影院一美女洗澡 | 五月色婷婷综合开心网4438| 91久久综合男人天堂| 免费av岛国天堂网站| av在线免费资源站| 精品视频国产在线观看| 国产精品久久久久网| 日韩黄色片在线观看网站| 久久永久免费精品人妻专区| 性色av一区二区三区久久久| 欧美第一页在线免费观看视频| 又粗又硬又猛又爽又黄的| 国产精品久久久久久久久福交| 日韩不卡中文在线视频网站| 天天干天天操天天玩天天射| 日韩人妻丝袜中文字幕| 亚洲国际青青操综合网站| 天天日天天添天天爽| 久久尻中国美女视频| 亚洲综合色在线免费观看| 高潮喷水在线视频观看| 欧美日本国产自视大全| 热思思国产99re| 男人操女人的逼免费视频| 国产久久久精品毛片| 岛国毛片视频免费在线观看| 中文字幕 人妻精品| 91精品一区二区三区站长推荐| 91精品国产黑色丝袜| 岛国黄色大片在线观看| 欧美一区二区三区在线资源| 93视频一区二区三区| 韩国亚洲欧美超一级在线播放视频 | 国产中文精品在线观看| 日本www中文字幕| 国产成人小视频在线观看无遮挡| 91麻豆精品久久久久| 日韩成人性色生活片| 青青青青青操视频在线观看| 国产黄色片在线收看| 经典亚洲伊人第一页| 国产女人露脸高潮对白视频| 2021年国产精品自拍| 一区二区在线观看少妇| 久久久久国产成人精品亚洲午夜| 久草视频首页在线观看| 亚洲在线免费h观看网站| 天堂av中文在线最新版| 国产麻豆精品人妻av| 亚洲午夜在线视频福利| 欧美成人黄片一区二区三区 | 日本一二三中文字幕| 一二三区在线观看视频| 国产亚洲视频在线二区| 亚洲日本一区二区三区| 亚洲男人的天堂a在线| 天天干天天操天天扣| 国产不卡av在线免费| 亚洲成人黄色一区二区三区| 国产精品免费不卡av| 阴茎插到阴道里面的视频| 婷婷综合亚洲爱久久| 国产亚洲欧美另类在线观看| 亚洲欧美国产综合777| 成人性黑人一级av| 久久久久久久久久一区二区三区| 成年人免费看在线视频| 国产伊人免费在线播放| 久久精品亚洲成在人线a| 久久久久久久久久久免费女人| 人妻最新视频在线免费观看| 国产亚洲精品视频合集| 青青草精品在线视频观看| 十八禁在线观看地址免费| 日本免费一级黄色录像| 国产麻豆精品人妻av| 欧美国产亚洲中英文字幕| 91啪国自产中文字幕在线| 久久久久久性虐视频| 国产黄网站在线观看播放| 亚洲码av无色中文| 午夜精品九一唐人麻豆嫩草成人| 午夜精品一区二区三区城中村| 91高清成人在线视频| 午夜精彩视频免费一区| 日本韩国免费一区二区三区视频| 偷拍美女一区二区三区| 91久久综合男人天堂| 在线播放一区二区三区Av无码| 国产 在线 免费 精品| 亚洲第一伊人天堂网| 天天做天天爽夜夜做少妇| 亚洲伊人久久精品影院一美女洗澡| 亚洲综合另类精品小说| 四川乱子伦视频国产vip| 午夜免费观看精品视频| 亚洲国际青青操综合网站| 在线观看成人国产电影| 东京热男人的av天堂| 久久热久久视频在线观看| 美女少妇亚洲精选av| 国产精品视频男人的天堂| 日本韩国免费一区二区三区视频| 日韩亚洲高清在线观看| 天堂av在线官网中文| 成人精品在线观看视频| 亚洲麻豆一区二区三区| 欧美日韩不卡一区不区二区| 婷婷久久久综合中文字幕| 1000部国产精品成人观看视频| 日本阿v视频在线免费观看| 9l人妻人人爽人人爽| 性欧美激情久久久久久久| 三级等保密码要求条款| 在线免费观看国产精品黄色| 精品人妻一二三区久久| 亚洲一区二区三区在线高清| 欧美日韩一级黄片免费观看| 93人妻人人揉人人澡人人| 小泽玛利亚视频在线观看| 欧美美女人体视频一区| 天天做天天干天天操天天射| 国内精品在线播放第一页| 国产一区二区火爆视频| 国产 在线 免费 精品| 青娱乐极品视频青青草| 黄片色呦呦视频免费看| 18禁免费av网站| 亚洲精品一区二区三区老狼| 欧美精品一区二区三区xxxx| 特大黑人巨大xxxx| 欧美黄片精彩在线免费观看| 激情伦理欧美日韩中文字幕| 中文字幕最新久久久| 国产综合视频在线看片| 久久精品国产999| 亚洲午夜电影之麻豆| 888亚洲欧美国产va在线播放| 欧美一区二区三区激情啪啪啪| 国产精品sm调教视频| 9l人妻人人爽人人爽| 亚洲人妻视频在线网| 欧美第一页在线免费观看视频| 动色av一区二区三区| 3D动漫精品啪啪一区二区下载| 亚洲精品在线资源站| 一区二区在线观看少妇| 日本美女性生活一级片| 亚洲最大黄了色网站| 美女福利写真在线观看视频| 国产精品久久久久久久女人18| 嫩草aⅴ一区二区三区| 亚洲欧美精品综合图片小说| 黄色成人在线中文字幕| 亚洲欧美一区二区三区爱爱动图| 国产精品伦理片一区二区| 欧洲亚洲欧美日韩综合| 国产密臀av一区二区三| 午夜精品一区二区三区更新| 婷婷六月天中文字幕| 亚洲最大黄了色网站| 国产精品人妻66p| 亚洲一区自拍高清免费视频| 精品一区二区三区午夜| 2018在线福利视频| 精品亚洲国产中文自在线| 国产黄色a级三级三级三级| 精品视频国产在线观看| 国产精品午夜国产小视频| av在线播放国产不卡| 视频久久久久久久人妻| 欧美专区日韩专区国产专区| 91极品大一女神正在播放| 91 亚洲视频在线观看| 亚洲区美熟妇久久久久| 日韩精品中文字幕福利| 亚洲精品亚洲人成在线导航| 天天日夜夜干天天操| 日韩一区二区三区三州| 午夜精品福利一区二区三区p| 亚洲一区二区久久久人妻| 免费一级黄色av网站| 亚洲欧美一区二区三区爱爱动图| aⅴ精产国品一二三产品| 日本熟女精品一区二区三区| 熟女少妇激情五十路| 日本美女成人在线视频| 性欧美日本大妈母与子| 久草极品美女视频在线观看| 亚洲精品ww久久久久久| 国产麻豆精品人妻av| 传媒在线播放国产精品一区| 五十路人妻熟女av一区二区| 女同性ⅹxx女同hd| 久久精品在线观看一区二区| 91九色porny国产蝌蚪视频| 天天日天天干天天干天天日| 日本人妻精品久久久久久| 日本少妇精品免费视频| 啊慢点鸡巴太大了啊舒服视频| 日韩av中文在线免费观看| 97人妻无码AV碰碰视频| 另类av十亚洲av| 日本女大学生的黄色小视频| 日本三极片中文字幕| 欧美日韩v中文在线| 亚洲天天干 夜夜操| 老司机免费福利视频网| 又粗又硬又猛又黄免费30| 亚洲天天干 夜夜操| 亚洲 图片 欧美 图片| 视频啪啪啪免费观看| 亚洲粉嫩av一区二区三区| 亚洲日本一区二区三区| 区一区二区三国产中文字幕| 好了av中文字幕在线| 熟女俱乐部一二三区| 啪啪啪啪啪啪啪啪av| 久久久久久久99精品| 人人妻人人爱人人草| 清纯美女在线观看国产| 91精品激情五月婷婷在线| 日韩人妻丝袜中文字幕| 五月天色婷婷在线观看视频免费| 激情国产小视频在线| 五十路熟女人妻一区二| 亚洲精品久久综合久| 做爰视频毛片下载蜜桃视频1| 国产成人精品久久二区91| 欧美精品 日韩国产| 18禁美女羞羞免费网站| 青娱乐最新视频在线| 91p0rny九色露脸熟女| 在线免费观看99视频| 成人av免费不卡在线观看| 欧美成人黄片一区二区三区 | 亚洲高清国产拍青青草原| 日韩人妻在线视频免费| 综合精品久久久久97| 日韩av有码中文字幕| 国产亚州色婷婷久久99精品| 久久久超爽一二三av| 欧美亚洲国产成人免费在线| 伊人开心婷婷国产av| 在线观看av观看av| 亚洲日本一区二区三区| 硬鸡巴动态操女人逼视频| 国产在线91观看免费观看| 国产伊人免费在线播放| 美女骚逼日出水来了| 精品一区二区三区午夜| 在线观看黄色成年人网站| 91快播视频在线观看| 天天日天天摸天天爱| 精品美女在线观看视频在线观看| 一区二区视频在线观看免费观看 | av手机在线观播放网站| 国产精品欧美日韩区二区| 精品av久久久久久久| 97人妻色免费视频| 中文 成人 在线 视频| 91www一区二区三区| 91精品国产综合久久久蜜| 成年人的在线免费视频| 天天爽夜夜爽人人爽QC| 亚洲精品 欧美日韩| 久久精品国产亚洲精品166m| 日韩精品二区一区久久| 插逼视频双插洞国产操逼插洞| aⅴ精产国品一二三产品| 天天干天天日天天谢综合156| 国产精品久久综合久久| 亚洲国产美女一区二区三区软件 | 亚洲免费在线视频网站| 三级等保密码要求条款| 亚洲变态另类色图天堂网| 老鸭窝在线观看一区| 无套猛戳丰满少妇人妻| 一区二区免费高清黄色视频| 久久永久免费精品人妻专区 | 国产乱弄免费视频观看| 男人天堂av天天操| eeuss鲁片一区二区三区| 中文字幕日韩人妻在线三区| 国产第一美女一区二区三区四区| 亚洲成人免费看电影| 亚洲欧美精品综合图片小说| 欧美日韩亚洲国产无线码| 欧美成人综合视频一区二区 | 亚洲黄色av网站免费播放| 91精品国产91久久自产久强 | 日韩中文字幕福利av| 国产福利小视频二区| 久久久久久9999久久久久| 亚洲一区二区三区偷拍女厕91| 男女啪啪视频免费在线观看| 成人18禁网站在线播放| 宅男噜噜噜666国产| 欧亚乱色一区二区三区| 白嫩白嫩美女极品国产在线观看| 55夜色66夜色国产精品站| 欧洲日韩亚洲一区二区三区| 欧美亚洲国产成人免费在线| 九一传媒制片厂视频在线免费观看| 99久久99久国产黄毛片| 天天操天天弄天天射| 午夜激情久久不卡一区二区| 日韩无码国产精品强奸乱伦| 美女骚逼日出水来了| 国产一区二区三免费视频| 国产精品精品精品999| 国产片免费观看在线观看| av视网站在线观看| 天天日天天爽天天干| 欧美视频一区免费在线| 超级av免费观看一区二区三区| av手机在线免费观看日韩av| 国产一区二区欧美三区| 中国熟女一区二区性xx| 国产麻豆乱子伦午夜视频观看| 久久机热/这里只有| 男人天堂av天天操| 91破解版永久免费| 精品一区二区亚洲欧美| 超污视频在线观看污污污| 啊啊好慢点插舔我逼啊啊啊视频 | 美女吃鸡巴操逼高潮视频| 亚洲自拍偷拍综合色| 大鸡巴操娇小玲珑的女孩逼| 精品成人午夜免费看| 成人网18免费视频版国产 | 日韩无码国产精品强奸乱伦| 天天日天天爽天天爽| 中文字幕中文字幕 亚洲国产| 亚洲国产成人av在线一区| 色爱av一区二区三区| 中文字幕成人日韩欧美| 国产男女视频在线播放| 免费黄页网站4188| 日韩视频一区二区免费观看| 久久永久免费精品人妻专区| 精品国产午夜视频一区二区| 日韩在线中文字幕色| weyvv5国产成人精品的视频| 在线观看成人国产电影| 扒开让我视频在线观看| 中文字幕高清免费在线人妻| 国产福利小视频二区| 色哟哟国产精品入口| 初美沙希中文字幕在线 | 亚洲欧美激情国产综合久久久| 姐姐的朋友2在线观看中文字幕| 欧美一区二区三区乱码在线播放 | 91精品综合久久久久3d动漫| 性色蜜臀av一区二区三区| 在线 中文字幕 一区| 97人妻色免费视频| av在线免费资源站| 在线国产精品一区二区三区| 亚洲一区二区激情在线| 99热国产精品666| 啊啊好大好爽啊啊操我啊啊视频| 成人在线欧美日韩国产| 亚洲av琪琪男人的天堂| 欧美一区二区三区四区性视频| 少妇高潮一区二区三区| 视频一区二区在线免费播放| 精品一区二区三区三区88| 亚洲av成人免费网站| 青青青视频自偷自拍38碰| 久久精品久久精品亚洲人| 美洲精品一二三产区区别| 欧美色呦呦最新网址| 国产 在线 免费 精品| 99久久成人日韩欧美精品| 国产在线观看免费人成短视频| 人妻丝袜av在线播放网址| 丰满的继坶3中文在线观看| 日韩精品中文字幕在线| 熟女国产一区亚洲中文字幕| 丰满熟女午夜福利视频| 日本啪啪啪啪啪啪啪| 天天操天天弄天天射| 亚洲天堂成人在线观看视频网站| 少妇一区二区三区久久久| 免费成人av中文字幕| 性色av一区二区三区久久久| 农村胖女人操逼视频| 国产无遮挡裸体免费直播视频| 亚洲Av无码国产综合色区| 岛国毛片视频免费在线观看| 91人妻精品久久久久久久网站 | 精品欧美一区二区vr在线观看| 亚洲一区二区三区av网站| 国产精品精品精品999| 小穴多水久久精品免费看| 18禁美女无遮挡免费| 丝袜亚洲另类欧美变态| 国产在线一区二区三区麻酥酥| 在线网站你懂得老司机| 风流唐伯虎电视剧在线观看| 免费在线看的黄片视频| 特大黑人巨大xxxx| 一二三中文乱码亚洲乱码one| 中文字幕在线观看极品视频| 日本精品一区二区三区在线视频。| 亚洲精品国产综合久久久久久久久| 黑人进入丰满少妇视频| 久草视频在线一区二区三区资源站| 日本又色又爽又黄又粗| 风流唐伯虎电视剧在线观看 | 国产精品女邻居小骚货| 青青草成人福利电影| 男女之间激情网午夜在线| 一区二区熟女人妻视频| 六月婷婷激情一区二区三区| 亚洲中文字幕人妻一区| 揄拍成人国产精品免费看视频| 亚洲成av人无码不卡影片一| 国产不卡av在线免费| 中文字幕日韩精品日本| 国产在线免费观看成人| 美女日逼视频免费观看| 国产aⅴ一线在线观看| 欧美日韩一级黄片免费观看| 91在线视频在线精品3| 中文字日产幕乱六区蜜桃| 国产一区二区欧美三区| 中文字幕人妻av在线观看| 加勒比视频在线免费观看| 99re6热在线精品| 丰满熟女午夜福利视频| 2022精品久久久久久中文字幕| 天天艹天天干天天操| 男生用鸡操女生视频动漫| 欧美麻豆av在线播放| 熟女人妻一区二区精品视频| 日本一区美女福利视频| 同居了嫂子在线播高清中文| 在线播放 日韩 av| 久草视频在线看免费| 日韩近亲视频在线观看| 日韩精品中文字幕在线| 亚洲av无码成人精品区辽| 欧美一区二区三区激情啪啪啪| 97人妻无码AV碰碰视频| 天天插天天狠天天操| 亚洲精品无码色午夜福利理论片| 自拍偷拍vs一区二区三区| 天天日天天爽天天干| 午夜精品亚洲精品五月色| 九色视频在线观看免费| 一级黄片大鸡巴插入美女| 天堂v男人视频在线观看| 91高清成人在线视频| 9色在线视频免费观看| 欧美视频一区免费在线| 日本黄色三级高清视频| 久久尻中国美女视频| 黑人大几巴狂插日本少妇| 精品亚洲在线免费观看| 美女吃鸡巴操逼高潮视频| 四川五十路熟女av| 国产一区二区火爆视频| 国产麻豆剧传媒精品国产av蜜桃| 亚洲av日韩高清hd| 丝袜肉丝一区二区三区四区在线看| 男人天堂av天天操| 欧美精品国产综合久久| 91大神福利视频网| 国产欧美精品一区二区高清| 欧美国品一二三产区区别| 欧美特色aaa大片| 在线免费观看视频一二区| 亚洲蜜臀av一区二区三区九色 | 无码日韩人妻精品久久| 97香蕉碰碰人妻国产樱花| AV天堂一区二区免费试看| 国产精品熟女久久久久浪潮| 国产女人叫床高潮大片视频| 一区二区在线视频中文字幕| 视频 国产 精品 熟女 | 国产三级影院在线观看| 老司机深夜免费福利视频在线观看 | 亚洲日本一区二区三区| 欧美日韩激情啪啪啪| eeuss鲁片一区二区三区| 黄色黄色黄片78在线| 国产之丝袜脚在线一区二区三区 | 男人的网址你懂的亚洲欧洲av | 伊人开心婷婷国产av| 亚洲av琪琪男人的天堂| 久久尻中国美女视频| 午夜美女少妇福利视频| 日韩一个色综合导航| 日韩二区视频一线天婷婷五| 婷婷六月天中文字幕| 精品美女福利在线观看| 亚洲欧美激情国产综合久久久| 亚洲高清国产拍青青草原| 午夜影院在线观看视频羞羞羞| 人妻3p真实偷拍一二区| 国产亚洲成人免费在线观看| 在线免费91激情四射| 亚洲国产成人无码麻豆艾秋| 成人av亚洲一区二区| 亚洲国产精品黑丝美女| chinese国产盗摄一区二区| 2018最新中文字幕在线观看| 亚洲欧美福利在线观看| 可以在线观看的av中文字幕| 最新91精品视频在线| 亚洲成人三级在线播放| 在线观看av2025| 自拍偷拍 国产资源| 亚洲午夜福利中文乱码字幕| 男女之间激情网午夜在线| 巨乳人妻日下部加奈被邻居中出 | 亚洲一级特黄特黄黄色录像片| 大香蕉伊人国产在线| 成人伊人精品色xxxx视频| 99热国产精品666| 欧美精品资源在线观看| 99热99re在线播放| 欧美天堂av无线av欧美| 一区二区三区久久久91| 青青伊人一精品视频| 中文字日产幕乱六区蜜桃| 色偷偷伊人大杳蕉综合网| 97人人模人人爽人人喊| 91免费放福利在线观看| 老司机在线精品福利视频| 99热久久这里只有精品| 日本女人一级免费片| 亚洲免费va在线播放| 国产午夜亚洲精品麻豆| 国产美女午夜福利久久| 精品视频国产在线观看| 在线新三级黄伊人网| 日韩北条麻妃一区在线| 自拍偷区二区三区麻豆| 51国产成人精品视频| 天天干夜夜操啊啊啊| 日韩影片一区二区三区不卡免费 | 青青草在观免费国产精品| av在线免费观看亚洲天堂| 欧美亚洲一二三区蜜臀| 亚洲专区激情在线观看视频| 水蜜桃一区二区三区在线观看视频 | 天天躁日日躁狠狠躁av麻豆| 亚洲欧美一卡二卡三卡| 久久久久久久久久一区二区三区 | 99精品视频在线观看免费播放| 国产91嫩草久久成人在线视频| 国产黄色片蝌蚪九色91| 超级福利视频在线观看| 成人免费公开视频无毒| 午夜激情高清在线观看| 粉嫩av蜜乳av蜜臀| 2020av天堂网在线观看| 精品少妇一二三视频在线| 日韩av熟妇在线观看| 色秀欧美视频第一页| 欧美在线偷拍视频免费看| 欧美成人精品欧美一级黄色| 蜜桃专区一区二区在线观看| 2021国产一区二区| 日本真人性生活视频免费看| 2022天天干天天操| 中文字幕一区二区三区蜜月 | 欧美成人综合视频一区二区 | 超鹏97历史在线观看| 国产一区成人在线观看视频| 一区二区在线视频中文字幕| 93人妻人人揉人人澡人人| 91大屁股国产一区二区| 天天做天天干天天操天天射| 亚洲综合在线观看免费| 成熟熟女国产精品一区| 男人天堂最新地址av| 五十路人妻熟女av一区二区| 亚洲中文精品字幕在线观看| 97精品成人一区二区三区| 自拍偷拍亚洲另类色图| 日韩一个色综合导航| 色哟哟在线网站入口| 性感美女高潮视频久久久| 欧美日韩亚洲国产无线码| 欧美一级片免费在线成人观看| 亚洲午夜伦理视频在线| 国产高潮无码喷水AV片在线观看| 亚洲精品一线二线在线观看| 青青在线视频性感少妇和隔壁黑丝| av在线shipin| 又色又爽又黄的美女裸体| 国产精品自拍偷拍a| 在线观看视频 你懂的| 无码中文字幕波多野不卡| 2022天天干天天操| 成人亚洲国产综合精品| 一个色综合男人天堂| 国产va在线观看精品| 免费无毒热热热热热热久| 国产成人精品久久二区91| 老有所依在线观看完整版| 亚洲午夜高清在线观看| 亚洲福利天堂久久久久久| 精品亚洲国产中文自在线| 天天综合天天综合天天网| 老熟妇凹凸淫老妇女av在线观看| 中文字幕在线乱码一区二区| 在线免费观看靠比视频的网站| 人妻无码色噜噜狠狠狠狠色| 在线成人日韩av电影| 天天日天天爽天天爽| 成人高清在线观看视频| 中文字幕高清资源站| 91社福利《在线观看| 亚洲成人黄色一区二区三区| 五十路熟女人妻一区二区9933| 欧美视频不卡一区四区| 成人综合亚洲欧美一区| 成人在线欧美日韩国产| 操的小逼流水的文章| 久久免费看少妇高潮完整版| 国产片免费观看在线观看| 亚洲欧美综合另类13p| 日韩中文字幕在线播放第二页| 19一区二区三区在线播放| 日韩视频一区二区免费观看| 久久久久久cao我的性感人妻| 91精品国产黑色丝袜| 中国黄片视频一区91| 亚洲一区二区三区精品乱码| 九一传媒制片厂视频在线免费观看 | 十八禁在线观看地址免费| 黑人大几巴狂插日本少妇| 男人的天堂在线黄色| 中文字幕亚洲久久久| 人妻另类专区欧美制服| 岛国免费大片在线观看| 老师啊太大了啊啊啊尻视频| 国产老熟女伦老熟妇ⅹ| 99re久久这里都是精品视频| 激情伦理欧美日韩中文字幕 | 欧美日韩人妻久久精品高清国产| 天天草天天色天天干| 亚洲一级av大片免费观看| 欧美韩国日本国产亚洲| 日韩一区二区电国产精品| 777奇米久久精品一区| 亚洲高清一区二区三区视频在线| 欧美日韩人妻久久精品高清国产 | 成年女人免费播放视频| 亚洲特黄aaaa片| 日本美女成人在线视频| 中文字幕熟女人妻久久久| 好了av中文字幕在线| japanese五十路熟女熟妇| 亚洲av琪琪男人的天堂| 99久久中文字幕一本人| 视频一区 视频二区 视频| 91国内视频在线观看| 大鸡巴操b视频在线| 日韩美女综合中文字幕pp| 天天日天天鲁天天操| 成年人啪啪视频在线观看| 超鹏97历史在线观看| 国产精选一区在线播放| 免费在线黄色观看网站| 蜜桃色婷婷久久久福利在线| 免费人成黄页网站在线观看国产| 日韩不卡中文在线视频网站| 啊用力插好舒服视频| av中文字幕在线观看第三页| 国产日韩欧美美利坚蜜臀懂色| 天天干天天操天天爽天天摸 | 日韩亚国产欧美三级涩爱| 欧美中文字幕一区最新网址| 成年人中文字幕在线观看| 精品黑人一区二区三区久久国产| 韩国AV无码不卡在线播放| 亚洲老熟妇日本老妇| 亚洲乱码中文字幕在线| 91试看福利一分钟| 亚洲av可乐操首页| 国产av一区2区3区| tube69日本少妇| 2022天天干天天操| 果冻传媒av一区二区三区 | 年轻的人妻被夫上司侵犯| 亚洲av日韩精品久久久| 精品视频一区二区三区四区五区| 18禁网站一区二区三区四区| 欧美视频中文一区二区三区| 中文字幕最新久久久| 精品欧美一区二区vr在线观看| 97色视频在线观看| 日本精品一区二区三区在线视频。| 中文字幕在线欧美精品| 国产精品伦理片一区二区| 77久久久久国产精产品| 天天日天天爽天天干| 2022国产精品视频| 欧美在线精品一区二区三区视频| 岛国免费大片在线观看| 亚洲va欧美va人人爽3p| 欧美日韩熟女一区二区三区| 中文字幕第一页国产在线| 超碰97人人澡人人| 欧美美女人体视频一区| 亚洲av黄色在线网站| 国内精品在线播放第一页| 男人的天堂在线黄色| 日韩加勒比东京热二区| 1区2区3区不卡视频| 人人超碰国字幕观看97| 青娱乐极品视频青青草| 经典av尤物一区二区| 中文字幕在线观看国产片| 天天射夜夜操综合网| 天天日天天透天天操| 久久亚洲天堂中文对白| 亚洲免费视频欧洲免费视频| 日本黄色三级高清视频| 青青青青青青青青青国产精品视频| 大香蕉大香蕉在线看| av老司机亚洲一区二区| 欧美一区二区三区乱码在线播放| 日本高清在线不卡一区二区| 亚洲成人av一区在线| 在线观看国产免费麻豆| 亚洲av日韩av第一区二区三区| 一级黄片大鸡巴插入美女 | 五月婷婷在线观看视频免费| 超碰在线观看免费在线观看| 国产成人精品av网站| 亚洲欧美自拍另类图片| 免费在线观看污污视频网站| 亚洲中文字幕综合小综合| 97成人免费在线观看网站| 亚洲av香蕉一区区二区三区犇| 亚洲综合乱码一区二区| 亚洲国产美女一区二区三区软件 | 18禁网站一区二区三区四区| 国产亚洲精品品视频在线| 国产一区二区三免费视频| 成人精品在线观看视频| 97色视频在线观看| 99热久久极品热亚洲| 国内精品在线播放第一页| 在线免费观看国产精品黄色| 欧美视频不卡一区四区| 加勒比视频在线免费观看| 一区二区三区四区中文| 激情五月婷婷免费视频| 日韩剧情片电影在线收看| 一区二区三区美女毛片| 伊人开心婷婷国产av| av黄色成人在线观看| 晚上一个人看操B片| 天天日天天干天天要| av在线免费观看亚洲天堂| 亚洲一区久久免费视频| 亚洲 清纯 国产com| 亚洲av在线观看尤物| 91九色国产porny蝌蚪| 国产真实灌醉下药美女av福利| 天天草天天色天天干| 亚洲精品国品乱码久久久久| 91免费观看国产免费| 国产精品成人xxxx| av天堂资源最新版在线看| 在线免费观看欧美小视频| 天天射夜夜操狠狠干| 91香蕉成人app下载| 老司机免费视频网站在线看| 亚洲欧美日韩视频免费观看| 99热99这里精品6国产| 视频一区 视频二区 视频| 亚洲精品麻豆免费在线观看| 中国把吊插入阴蒂的视频| 国产中文精品在线观看| 水蜜桃一区二区三区在线观看视频 | 成人亚洲精品国产精品| 天天操天天污天天射| 亚洲一区av中文字幕在线观看| 黄色视频成年人免费观看| 成人色综合中文字幕| www天堂在线久久| 超级福利视频在线观看| 超碰公开大香蕉97| 亚洲午夜高清在线观看| 99热碰碰热精品a中文| 内射久久久久综合网| 91精品国产高清自在线看香蕉网 | av中文字幕电影在线看| 自拍偷拍日韩欧美亚洲| 中文字幕人妻一区二区视频| 清纯美女在线观看国产| 免费在线观看污污视频网站| 日韩中文字幕在线播放第二页 | 天天操天天干天天艹| 5528327男人天堂| 亚洲精品精品国产综合| 伊人成人综合开心网| 在线国产精品一区二区三区| yellow在线播放av啊啊啊| 93精品视频在线观看| 女蜜桃臀紧身瑜伽裤| 欧美一区二区三区乱码在线播放| 欧美成人黄片一区二区三区| 97少妇精品在线观看| 亚洲粉嫩av一区二区三区| 香港一级特黄大片在线播放| 99久久久无码国产精品性出奶水| 2021久久免费视频| 99精品国产自在现线观看| 欧美日韩激情啪啪啪| 亚洲国产美女一区二区三区软件| 久久香蕉国产免费天天| 精品美女在线观看视频在线观看| 国产麻豆剧传媒精品国产av蜜桃| 天天干天天插天天谢| 19一区二区三区在线播放| 亚洲国产最大av综合| 天天干天天插天天谢| 国产视频精品资源网站| 亚洲av人人澡人人爽人人爱| 日韩人妻xxxxx| 欧亚日韩一区二区三区观看视频| av天堂中文免费在线| 不卡精品视频在线观看| 国产日韩欧美视频在线导航| 日本一本午夜在线播放| 亚洲第一伊人天堂网| 韩国AV无码不卡在线播放| 免费看国产又粗又猛又爽又黄视频 | 国产午夜无码福利在线看| 国产亚洲成人免费在线观看 | 在线免费观看欧美小视频| 最新日韩av传媒在线| 日韩av有码中文字幕| 夜夜操,天天操,狠狠操| 亚洲国产精品久久久久蜜桃| 端庄人妻堕落挣扎沉沦| 成人免费公开视频无毒| 色综合色综合色综合色| 天堂v男人视频在线观看| 国产激情av网站在线观看| 在线观看免费岛国av| 精品高跟鞋丝袜一区二区| 色婷婷六月亚洲综合香蕉| 亚洲高清国产自产av| 亚洲一区久久免费视频| 国产丰满熟女成人视频| 国产午夜男女爽爽爽爽爽视频| 国产女人露脸高潮对白视频| av乱码一区二区三区| 一色桃子久久精品亚洲| 最新97国产在线视频| 在线国产中文字幕视频| 2022精品久久久久久中文字幕| 精品日产卡一卡二卡国色天香| 热久久只有这里有精品| 在线制服丝袜中文字幕| 最新中文字幕乱码在线| 91国产在线免费播放| 日本一区美女福利视频| 自拍偷拍日韩欧美亚洲| 无忧传媒在线观看视频| 香港三日本三韩国三欧美三级| 传媒在线播放国产精品一区| 免费在线看的黄网站| 早川濑里奈av黑人番号| 插小穴高清无码中文字幕| 久草电影免费在线观看| 亚洲另类综合一区小说| 2025年人妻中文字幕乱码在线| 边摸边做超爽毛片18禁色戒| 国产精品久久久久久久久福交| 欧美亚洲中文字幕一区二区三区 | 亚洲国产免费av一区二区三区| 亚洲伊人久久精品影院一美女洗澡 | 免费在线福利小视频| 久久热这里这里只有精品| 欧美爆乳肉感大码在线观看| 天天操,天天干,天天射| 98视频精品在线观看| 韩国女主播精品视频网站| 午夜精品久久久久麻豆影视| 黑人3p华裔熟女普通话| 久久久久久久精品成人热| 亚洲美女自偷自拍11页| 成人av亚洲一区二区| 又色又爽又黄又刺激av网站| 国产视频一区在线观看| 日韩av有码中文字幕| 亚洲天天干 夜夜操| 午夜国产福利在线观看| 成人免费做爰高潮视频| 亚洲另类图片蜜臀av| 最新国产亚洲精品中文在线| 亚洲视频在线观看高清| 2017亚洲男人天堂| 国产妇女自拍区在线观看| 天天综合天天综合天天网| 国产精品视频欧美一区二区| 成人H精品动漫在线无码播放| 青青青视频自偷自拍38碰| 亚洲精品一区二区三区老狼| 福利一二三在线视频观看| 国产刺激激情美女网站| 好太好爽好想要免费| av高潮迭起在线观看| 日本18禁久久久久久| 五月天色婷婷在线观看视频免费 | 久久久麻豆精亚洲av麻花| 成人免费公开视频无毒 | 91极品大一女神正在播放| 午夜成午夜成年片在线观看| 在线观看的a站 最新| 亚洲av成人免费网站| 五月天久久激情视频| 色综合久久五月色婷婷综合| 亚洲伊人av天堂有码在线| 免费男阳茎伸入女阳道视频| 久久精品美女免费视频| av男人天堂狠狠干| 免费在线福利小视频| 亚洲综合另类欧美久久| 亚洲天堂成人在线观看视频网站| 91桃色成人网络在线观看| 国产精品成久久久久三级蜜臀av| 精品高潮呻吟久久av| 狠狠鲁狠狠操天天晚上干干| 一区国内二区日韩三区欧美| 国产自拍在线观看成人| 在线可以看的视频你懂的| 日本一本午夜在线播放| 动漫黑丝美女的鸡巴| 成年女人免费播放视频| 婷婷五月亚洲综合在线| 青青操免费日综合视频观看| 亚洲视频在线观看高清| 538精品在线观看视频| 绝色少妇高潮3在线观看| 亚洲欧美福利在线观看| 色秀欧美视频第一页| 日韩美女福利视频网| 午夜毛片不卡免费观看视频| 国产一区二区欧美三区| 国产精品久久久久国产三级试频| 最新的中文字幕 亚洲| 精品美女福利在线观看| 日本一区精品视频在线观看| 91老师蜜桃臀大屁股| 午夜精品久久久久麻豆影视| 岛国一区二区三区视频在线| 55夜色66夜色国产精品站| 久久尻中国美女视频| 国产午夜福利av导航| 成人综合亚洲欧美一区 | 91欧美在线免费观看| 青青操免费日综合视频观看| 国产精品久久久久国产三级试频| av俺也去在线播放| xxx日本hd高清| 日韩黄色片在线观看网站| 久久久精品999精品日本| 伊人网中文字幕在线视频| 3D动漫精品啪啪一区二区下载| 欧亚乱色一区二区三区| 只有精品亚洲视频在线观看| yy6080国产在线视频| 亚洲激情偷拍一区二区| 青青青青视频在线播放| 色伦色伦777国产精品| 国产+亚洲+欧美+另类| 久久久久久久一区二区三| 偷偷玩弄新婚人妻h视频| 国产精品久久久久网| av黄色成人在线观看| 国产日韩精品电影7777| 日本熟妇色熟妇在线观看| 欧美乱妇无乱码一区二区| 国产极品美女久久久久久| 蝴蝶伊人久久中文娱乐网| 天天做天天干天天舔| 亚洲一区二区三区uij| 夜女神免费福利视频| 91精品国产综合久久久蜜| 岛国一区二区三区视频在线| 国产 在线 免费 精品| 任你操视频免费在线观看| 中文字幕一区二区人妻电影冢本| 国产日韩av一区二区在线| 水蜜桃一区二区三区在线观看视频 | 亚洲精品午夜aaa久久| 日本少妇高清视频xxxxx| 丝袜肉丝一区二区三区四区在线 | 中文字幕第三十八页久久| 成人免费毛片aaaa| 日本一二三区不卡无| 爱爱免费在线观看视频| 66久久久久久久久久久| 中文字幕日韩精品日本| 11久久久久久久久久久| 亚洲图片欧美校园春色| 97人妻总资源视频| 亚洲av男人天堂久久| 91试看福利一分钟| 国产妇女自拍区在线观看| 亚洲自拍偷拍综合色| 福利午夜视频在线观看| 熟女视频一区,二区,三区| 久久午夜夜伦痒痒想咳嗽P| 亚洲欧美一卡二卡三卡| 国产精品成人xxxx| 黑人乱偷人妻中文字幕| av一本二本在线观看| 人人妻人人人操人人人爽| 在线免费观看视频一二区| av视网站在线观看| 2021年国产精品自拍| 成人av久久精品一区二区| 搡老熟女一区二区在线观看| 天天射夜夜操狠狠干| caoporn蜜桃视频| 精品国产午夜视频一区二区| 经典国语激情内射视频| 蜜臀成人av在线播放| 日韩欧美国产一区不卡| 大尺度激情四射网站| 97国产福利小视频合集| 五月天色婷婷在线观看视频免费| 亚洲乱码中文字幕在线| 性生活第二下硬不起来| 日本精品视频不卡一二三| 久久农村老妇乱69系列| 国产一区二区火爆视频| 国产aⅴ一线在线观看| 加勒比视频在线免费观看| 97精品人妻一区二区三区精品| 五十路老熟女码av| 欧美亚洲国产成人免费在线 | 欧美精产国品一二三产品区别大吗| 久久久久久国产精品| 我想看操逼黄色大片| 亚洲av色香蕉一区二区三区 | 日本午夜福利免费视频| 在线网站你懂得老司机| 国产真实乱子伦a视频| aⅴ五十路av熟女中出| 好男人视频在线免费观看网站| 中文字幕高清免费在线人妻| huangse网站在线观看| av成人在线观看一区| 99精品国产aⅴ在线观看| 欧美视频一区免费在线| 北条麻妃av在线免费观看| 自拍偷拍,中文字幕| 岳太深了紧紧的中文字幕| 亚洲视频在线视频看视频在线| 视频一区 视频二区 视频| 亚洲欧美国产麻豆综合| 国产亚洲欧美45p| 99久久久无码国产精品性出奶水| 精品av久久久久久久| 日视频免费在线观看| 亚洲国产美女一区二区三区软件| 岛国免费大片在线观看| 伊人开心婷婷国产av| 欧美日韩高清午夜蜜桃大香蕉| 97人妻总资源视频| 人妻无码中文字幕专区| 亚洲国产成人无码麻豆艾秋| 黄色片一级美女黄色片| 大鸡巴插入美女黑黑的阴毛| 亚洲精品国产在线电影| 国产一区二区火爆视频| 日韩剧情片电影在线收看| 狠狠躁狠狠爱网站视频| 3344免费偷拍视频| 美洲精品一二三产区区别| 全国亚洲男人的天堂| 性欧美激情久久久久久久| 国产成人精品福利短视频| 东京热男人的av天堂| 秋霞午夜av福利经典影视| 日本www中文字幕| 天天日天天干天天搡| 亚洲视频在线视频看视频在线| 国产精品久久久久久久女人18| 91自产国产精品视频| 66久久久久久久久久久| 91精品国产91久久自产久强 | 女同久久精品秋霞网| 人妻少妇av在线观看| 水蜜桃国产一区二区三区| 黄色无码鸡吧操逼视频| 亚洲最大黄了色网站| 精品乱子伦一区二区三区免费播| av无限看熟女人妻另类av| 91九色国产熟女一区二区| 久草视频在线一区二区三区资源站| 丝袜美腿视频诱惑亚洲无| 99re6热在线精品| 中文字幕人妻三级在线观看| 青娱乐最新视频在线| 白白操白白色在线免费视频| 不卡精品视频在线观看| 国产一级麻豆精品免费| 福利午夜视频在线观看| 日韩剧情片电影在线收看| 国产日韩精品一二三区久久久| 天堂va蜜桃一区入口| av中文字幕网址在线| 青青青青青青青在线播放视频| 国产熟妇一区二区三区av| 欧美成一区二区三区四区| 欧美性感尤物人妻在线免费看| 激情啪啪啪啪一区二区三区| 欧美精品一区二区三区xxxx| 亚洲人妻av毛片在线| 老鸭窝在线观看一区| 男女啪啪视频免费在线观看| 11久久久久久久久久久| 老司机深夜免费福利视频在线观看| 欧美一区二区三区激情啪啪啪| 大鸡吧插逼逼视频免费看 | 欧美天堂av无线av欧美| 欧美乱妇无乱码一区二区| 日本性感美女视频网站| 老鸭窝在线观看一区| 特级无码毛片免费视频播放| 久久精品国产23696| 红杏久久av人妻一区| 国产又粗又猛又爽又黄的视频美国| 日韩欧美亚洲熟女人妻| 人人妻人人澡欧美91精品| 亚洲av色香蕉一区二区三区| 鸡巴操逼一级黄色气| 午夜成午夜成年片在线观看| 福利视频网久久91| 鸡巴操逼一级黄色气| 91精品国产91青青碰| 青青青青青青草国产| 国产精品视频欧美一区二区| 免费观看丰满少妇做受| 农村胖女人操逼视频| 亚洲人人妻一区二区三区| 色偷偷伊人大杳蕉综合网| 肏插流水妹子在线乐播下载 | 青娱乐最新视频在线| 孕妇奶水仑乱A级毛片免费看| 色呦呦视频在线观看视频| 日本少妇的秘密免费视频| 国产普通话插插视频| jul—619中文字幕在线| 亚洲最大黄 嗯色 操 啊| eeuss鲁片一区二区三区| 免费69视频在线看| 青娱乐极品视频青青草| 中文人妻AV久久人妻水| 亚洲av人人澡人人爽人人爱| 亚洲丝袜老师诱惑在线观看| 香蕉91一区二区三区| 美女小视频网站在线| 97香蕉碰碰人妻国产樱花| 91中文字幕免费在线观看| 绝色少妇高潮3在线观看| 99国产精品窥熟女精品| 2021天天色天天干| 国产高潮无码喷水AV片在线观看| 亚洲免费成人a v| 11久久久久久久久久久| 在线新三级黄伊人网| 性欧美日本大妈母与子| 一区二区视频在线观看免费观看| 青青草精品在线视频观看| 超碰在线中文字幕一区二区| 福利国产视频在线观看| 操的小逼流水的文章| 午夜福利资源综合激情午夜福利资 | 青青青国产免费视频| 女警官打开双腿沦为性奴| 非洲黑人一级特黄片| 视频一区二区在线免费播放| 午夜精品一区二区三区福利视频| 日韩成人性色生活片| 91色九色porny| 日韩精品中文字幕福利| 成年午夜影片国产片| 日韩写真福利视频在线观看| 日韩美女福利视频网| 日本一二三区不卡无| 2020久久躁狠狠躁夜夜躁|