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

PageHelper 分頁為什么會失效,含原理分析

數(shù)據(jù)庫 其他數(shù)據(jù)庫
構(gòu)造 PageInfo 的時候,判斷 List 類型,如果類型是 Page ,也就是我們說的生效的情況,那就能正常的返回分頁信息。如果單純就是個Collection,則分頁信息就按照傳入的這個集合給你返回,這就是為什么在分頁不生效的時候,返回的total就是你傳入的 List 的size。

大家好,我是風(fēng)箏

作為一個 Java 程序員,想必一定對 MyBatis 非常熟悉,尤其在國內(nèi)來看,只要是 Java 項(xiàng)目并且涉及到數(shù)據(jù)庫操作,絕大多數(shù)都會使用 MyBatis,或者是 MyBatis 的各個變種。

那在查詢數(shù)據(jù)庫的場景中,分頁是無法避免的,不管前端是按鈕翻頁還是下拉加載,對應(yīng)到數(shù)據(jù)庫上都是一樣的,都是利用數(shù)據(jù)庫的條數(shù)限制,例如 MySQL 中的 Limit。

而在完成分頁需求時,不知道有多少同學(xué)是自己實(shí)現(xiàn)的,還有多少同學(xué)使用 PageHelper 。剛開始自學(xué) Java 的時候,我都是古法手工擼 SQL 語句,在 Mapper 層傳分頁參數(shù),然后在 SQL 中分頁。直到后來我發(fā)現(xiàn)了 PageHelper ,害,早直到有這家伙,還自己寫啥呀,交給它就完事兒了。

后來的很多項(xiàng)目中都使用它,有從 Spring Boot 最基礎(chǔ)的腳手架從 0 搭建的項(xiàng)目,也有直接使用的成熟腳手架,例如若依,都在使用 PageHelper,從此分頁就變得異常簡單了。

前幾天,有個工作不就的 Java 小哥問我說問題,說是 PageHelper 本來好好的,結(jié)果加了幾行代碼,分頁數(shù)據(jù)都失效了。

當(dāng)他還沒有亮出代碼的時候,我基本上已經(jīng)猜到問題原因了。倒不是我厲害,恰恰相反,因?yàn)槲抑昂懿说臅r候也碰到過類似的問題,而且不止一次。也就是菜了一次,沒有吸取教訓(xùn),又菜了第二次。直到我研究了一下 PageHelper 的原理,之后才沒有出現(xiàn)類似的問題。

失效原因分析及解決

當(dāng)小哥給我發(fā)來代碼后,死去的以及開始攻擊我,基本就是當(dāng)初我寫的代碼的格式,不光是我,我 Google 了一下,出現(xiàn)問題的基本都是這么用的。

我簡化了一下這個邏輯:

  • 設(shè)置分頁參數(shù) PageHelper.startPage(1,10);
  • 通過一個 Mapper 查詢出結(jié)果集;
  • 通過上一步的結(jié)果集構(gòu)造 PageInfo
  • 這時候,構(gòu)造出的 PageInfo 是沒問題的。

如果你的業(yè)務(wù)比較單純,這樣也就沒問題了,但是有些情況下不是這樣的。

public PageInfo<DataDetailVo> search(String keyword) {
 List<DataDetailVo> voList = new ArrayList<>();
 // 1.設(shè)置分頁,第1頁,10條
 PageHelper.startPage(1,10);
 // 2.查詢結(jié)果集
 List<DataVo> dataVos = xxxMapper.searchDataList(keyword);

 // 3.通過上一步的結(jié)果集構(gòu)造 PageInfo
 PageInfo<DataVo> pageSuccess = new PageInfo<>(dataVos);
 // 結(jié)果是對的
 log.info("pageSuccess:" + JSON.toJSONString(pageSuccess));

 // 4.真實(shí)情況,還要對結(jié)果集進(jìn)行加工,將結(jié)果集轉(zhuǎn)變了類型
 for (DataVo dataVo : dataVos) {
  DataDetailVo vo = new DataDetailVo();
  BeanUtils.copyProperties(dataVo, vo);
  voList.add(vo);
 }

 // 5.這時候,通過新的結(jié)果集構(gòu)造 PageInfo,分頁信息就是錯誤的
 PageInfo<DataDetailVo> pageFail = new PageInfo<>(voList);
 log.info("pageFail:" + JSON.toJSONString(pageFail));
 
 return pageFail;
}
  • 真實(shí)情況,還要對結(jié)果集進(jìn)行加工,將結(jié)果集轉(zhuǎn)變了類型;
  • 這時候,通過新的結(jié)果集構(gòu)造 PageInfo,分頁信息就是錯誤的

很多時候會像第4步那樣,對初始結(jié)果集進(jìn)行進(jìn)一步再加工,而這些加工的數(shù)據(jù)沒辦法通過 SQL 直接獲取到,或者用 SQL 獲取代價太大。

甚至有時候會像上面的代碼那樣,從數(shù)據(jù)庫查詢出來的實(shí)體類型和實(shí)際返回給調(diào)方的實(shí)體類型都不一樣。有的同學(xué)說,難道就不能在 mapper 層直接返回需要類型嗎?當(dāng)然可以,不過很多時候不可能都這么完美。

問題原因

原因很明顯,稍有經(jīng)驗(yàn)的同學(xué)可能已經(jīng)看出來了,就是因?yàn)榈?步構(gòu)造 PageInfo 時使用了一個新的 List,才導(dǎo)致分頁失效的。

這只是表現(xiàn)出來的原因,但是 Mapper 查出來的是一個 List(dataVos),經(jīng)過加工的也是 List(voList),怎么就一個正常,一個不正常呢,難道這兩個 List 有什么不一樣的嗎?還是 PageHelper 只認(rèn)第一個 List?

下面介紹原理的時候再說這個問題。

解決方式

解決這個問題也很簡單。

方式1:不要加工了嘛,mapper 返回啥,就直接給調(diào)用方返回啥。

也不是不可以,你要是產(chǎn)品經(jīng)理+老板的話,可以直接改需求,讓需求來適應(yīng)代碼,但是基本上行不通;

方式2:前面也說了,直接讓 mapper 返回最終返回給調(diào)用方的類型,不要在加工的時候生成新的 List 了。

這種也可以,但是改動可能比較大,因?yàn)橛械?Mapper 層的方法是供很多其他方法調(diào)用的,Mapper 層基本上只需要返回最通用的類型。不能為了某個方法調(diào)用方,而讓其他調(diào)用方也做出改變。

當(dāng)然了,你可以為這種特殊的需求新加一個 Mapper 方法,只是比較麻煩而已。

方式3:在構(gòu)造 PageInfo 的時候稍加修改就可以了

只需要將原本構(gòu)造錯誤的 PageInfo

PageInfo<DataDetailVo> pageFail = new PageInfo<>(voList);
log.info("pageFail:" + JSON.toJSONString(pageFail));

改為下面這樣既可,還是用 Mapper 層返回的dataVos 集合來構(gòu)造 PageInfo,只不過稍后將加工后的新的List 賦值給 PageInfo 的 list 屬性即可。

PageInfo pageSuccess2 = new PageInfo<>(dataVos);
pageSuccess2.setList(voList);

原理分析

前面查找原因的時候提到這樣一個問題:Mapper 查出來的是一個 List(dataVos),經(jīng)過加工的也是 List(voList),怎么就一個正常,一個不正常呢,難道這兩個 List 有什么不一樣的嗎?

我們就順著這個問題思考就可以了,我先說結(jié)論,這倆 List 確實(shí)不一樣,確切的說,Mapper 查出來的那個 List 是被 PageHelper 包裝后的List,再確切的說是 PageHelper 里的 Page 對象。

PageHelper.startPage(1,10);
// 2.查詢結(jié)果集
List<DataVo> dataVos = xxxMapper.searchDataList(keyword);

通過調(diào)試代碼可以看出來,dataVos 就是一個披著 List 外衣的 Page 對象,你可以直接在這個對象上調(diào)用 Page 中的方法,比如 getTotal(),可以直接返回?cái)?shù)量的。

圖片圖片

而你自己加工后的集合,就真的是個單純的 ArrayList 了,所以在使用 PageInfo 構(gòu)造分頁對象的時候,是絕對不可能獲取到真實(shí)的分頁參數(shù)的,比如總條數(shù)、總頁數(shù)等。

簡要概括一下這個過程,不過多解釋源碼,整個流程大致如下。

圖片圖片

通過 ThreadLocal 存儲 Page 初始參數(shù)

首先通過代碼 PageHelper.startPage(1,10);設(shè)置分頁參數(shù),這個過程很簡單,就是初始化 Page 對象,然后存到 ThreadLocal 中。

關(guān)于 ThreadLocal 可以參考我之前的一篇文章 我還是不懂 ThreadLocal,不要沒標(biāo)題迷惑,看完就懂了。

public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
 Page<E> page = new Page<E>(pageNum, pageSize, count);
 page.setReasonable(reasonable);
 page.setPageSizeZero(pageSizeZero);
 //當(dāng)已經(jīng)執(zhí)行過orderBy的時候
 Page<E> oldPage = getLocalPage();
 if (oldPage != null && oldPage.isOrderByOnly()) {
  page.setOrderBy(oldPage.getOrderBy());
 }
 setLocalPage(page);
 return page;
}

其中 setLocalPage(page)就是像 ThreadLocal 中存 Page 對象,一會兒還有地方用到它。

利用 MyBatis 攔截器機(jī)制

然后就是利用了 MyBatis 的攔截器機(jī)制,攔截器主要做兩件事,第一件就是在查詢數(shù)據(jù)集合前先count一下,把數(shù)量查出來。第二件就是將查詢出來的數(shù)據(jù)集包裝成 Page 對象,當(dāng)然了 Page 是繼承自 ArrayList 的,要不然它也不能偽裝的這么好。

在 PageHelper 源碼中有 PageInterceptor.java這個攔截器,主要是里面的 intercept 方法。這里面就是實(shí)現(xiàn)核心邏輯的主戰(zhàn)場。

public Object intercept(Invocation invocation) throws Throwable {
 try {
  // ...
  List resultList;
  //調(diào)用方法判斷是否需要進(jìn)行分頁,如果不需要,直接返回結(jié)果
  if (!dialect.skip(ms, parameter, rowBounds)) {
   //判斷是否需要進(jìn)行 count 查詢
   if (dialect.beforeCount(ms, parameter, rowBounds)) {
    //查詢總數(shù)
    Long count = count(executor, ms, parameter, rowBounds, null, boundSql);
    //處理查詢總數(shù),返回 true 時繼續(xù)分頁查詢,false 時直接返回
    if (!dialect.afterCount(count, parameter, rowBounds)) {
     //當(dāng)查詢總數(shù)為 0 時,直接返回空的結(jié)果
     return dialect.afterPage(new ArrayList(), parameter, rowBounds);
    }
   }
   resultList = ExecutorUtil.pageQuery(dialect, executor,
     ms, parameter, rowBounds, resultHandler, boundSql, cacheKey);
  } else {
   //rowBounds用參數(shù)值,不使用分頁插件處理時,仍然支持默認(rèn)的內(nèi)存分頁
   resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);
  }
  // 處理加工后的結(jié)果集
  return dialect.afterPage(resultList, parameter, rowBounds);
 }
}

先判斷是否需要進(jìn)行分頁,如果不需要,直接返回結(jié)果。也就是這行代碼,你可以點(diǎn)進(jìn)去看一下 skip 這個方法,就是獲取 ThreadLocal 中的Page對象,看是不是存在,是不是有分頁參數(shù),有的話就是需要分頁,沒有就直接按照正常的查詢走了。

if (!dialect.skip(ms, parameter, rowBounds))

如果需要分頁的話,先查詢一下數(shù)量。

Long count = count(executor, ms, parameter, rowBounds, null, boundSql);

然后根據(jù)分頁參數(shù),查詢分頁結(jié)果集。

resultList = ExecutorUtil.pageQuery(dialect, executor,
     ms, parameter, rowBounds, resultHandler, boundSql, cacheKey);

之后對結(jié)果集加工并返回。

return dialect.afterPage(resultList, parameter, rowBounds);

最終加工成 Page 的方法,看到?jīng)],還是先從 ThreadLocal中拿,然后將原始結(jié)果集放進(jìn)去。

public Object afterPage(List pageList, Object parameterObject, RowBounds rowBounds) {
 Page page = getLocalPage();
 if (page == null) {
  return pageList;
 }
 page.addAll(pageList);
 if (!page.isCount()) {
  page.setTotal(-1);
 } else if ((page.getPageSizeZero() != null && page.getPageSizeZero()) && page.getPageSize() == 0) {
  page.setTotal(pageList.size());
 } else if (page.isOrderByOnly()) {
  page.setTotal(pageList.size());
 }
 return page;
}

最后 PageInfo 構(gòu)造

最后,構(gòu)造 PageInfo 的時候,判斷 List 類型,如果類型是 Page ,也就是我們說的生效的情況,那就能正常的返回分頁信息。如果單純就是個Collection,則分頁信息就按照傳入的這個集合給你返回,這就是為什么在分頁不生效的時候,返回的total就是你傳入的 List 的size。

public PageInfo(List<? extends T> list, int navigatePages) {
        super(list);
        if (list instanceof Page) {
            Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();

            this.pages = page.getPages();
            this.size = page.size();
            //由于結(jié)果是>startRow的,所以實(shí)際的需要+1
            if (this.size == 0) {
                this.startRow = 0;
                this.endRow = 0;
            } else {
                this.startRow = page.getStartRow() + 1;
                //計(jì)算實(shí)際的endRow(最后一頁的時候特殊)
                this.endRow = this.startRow - 1 + this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();

            this.pages = this.pageSize > 0 ? 1 : 0;
            this.size = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }
        if (list instanceof Collection) {
            calcByNavigatePages(navigatePages);
        }
    }

怎么樣,學(xué)廢了嗎?

責(zé)任編輯:武曉燕 來源: 古時的風(fēng)箏
相關(guān)推薦

2022-04-13 20:53:15

Spring事務(wù)管理

2019-11-25 16:05:20

MybatisPageHelpeJava

2022-09-20 22:27:08

事務(wù)失效public 修飾

2020-12-11 08:02:16

索引MySQL存儲

2023-01-17 09:13:08

Mybatis后端框架

2022-03-02 10:11:41

索引場景數(shù)據(jù)庫

2020-04-27 07:13:37

Nginx底層進(jìn)程

2018-05-09 09:55:36

數(shù)據(jù)分析

2020-10-27 14:15:42

SpringBoot

2012-08-17 10:01:07

云計(jì)算

2020-03-30 15:05:46

Kafka消息數(shù)據(jù)

2012-03-26 10:26:43

openstackeucalyptus

2012-05-02 10:08:51

桌面Linux微軟

2021-07-09 09:24:06

NanoID UUID軟件開發(fā)

2025-03-10 07:10:00

2021-01-25 07:14:53

Cloud DevOps云計(jì)算

2023-03-22 09:10:18

IT文檔語言

2014-03-05 14:58:00

蘋果CarPlayiOS

2015-12-07 10:49:43

卸載App用戶體驗(yàn)

2022-05-11 08:22:54

IO負(fù)載NFSOS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

宅男av一区二区三区| 亚洲人成电影网| 91免费国产精品| 亚洲av成人无码久久精品老人| 久久av最新网址| 视频在线一区二区| 国产成人精品一区二区在线小狼 | 中文成人在线| 亚洲国产精品一区二区久久恐怖片 | 国产精品欧美日韩一区二区| 激情高潮到大叫狂喷水| 99香蕉久久| 色婷婷综合激情| 亚洲精品少妇一区二区| 美女欧美视频在线观看免费| 久久99国产精品尤物| 97视频色精品| 亚洲人与黑人屁股眼交| 自拍偷拍精品| 欧美xxxxxxxx| 一本一道久久a久久综合蜜桃| 川上优av中文字幕一区二区| 亚洲日本在线视频观看| 免费久久久一本精品久久区| 国产黄色美女视频| 裸体一区二区三区| 日本伊人精品一区二区三区介绍| 中文字幕五月天| 日本在线电影一区二区三区| 亚洲精品99久久久久中文字幕| 99精品999| 欧美日韩在线精品一区二区三区激情综合 | 日韩欧美在线综合网| 麻豆传传媒久久久爱| 91九色国产在线播放| 亚洲欧洲综合另类| 亚洲欧美日产图| 国产在线一二| 91色综合久久久久婷婷| 国产精品加勒比| 精品国产99久久久久久宅男i| 免费在线看成人av| 国产mv免费观看入口亚洲| 日韩精品――中文字幕| 在线看片欧美| 欧美国产视频一区二区| 亚洲色偷偷综合亚洲av伊人| 日韩av在线播放网址| 亚洲香蕉成人av网站在线观看| 污污内射在线观看一区二区少妇| 日韩一区二区三区精品| 欧美一区二区三区小说| 午夜免费一级片| 日韩大陆av| 欧美日韩国产a| 夜夜夜夜夜夜操| **国产精品| 91精品国产一区二区人妖| 亚洲欧美日韩三级| 精品国产麻豆| 精品三级在线观看| 欧美熟妇精品一区二区蜜桃视频 | 日韩视频一区二区三区在线播放 | 日韩成人一级| 亚洲欧美一区二区激情| 日本xxxxxxxxx18| 区一区二视频| 久久视频中文字幕| 欧美国产精品一二三| 国内在线观看一区二区三区| 久久久久久久999精品视频| 欧美成人aaaaⅴ片在线看| 亚洲欧洲日本一区二区三区| 91高清视频免费| 国产美女www爽爽爽| 久久成人综合网| 91影院未满十八岁禁止入内| 亚洲第一色视频| 99视频热这里只有精品免费| 欧美极品一区| 在线看的av网站| 亚洲精品视频一区| 青青艹视频在线| 成人亚洲网站| 精品国产百合女同互慰| 欧美做受xxxxxⅹ性视频| 久久亚洲成人| 国外成人在线直播| 精品视频一二三区| 国产精品99久久久久| 久久99蜜桃综合影院免费观看| 九色网友自拍视频手机在线| 亚洲欧洲精品一区二区精品久久久| 四虎永久免费网站| 伊人久久国产| 3751色影院一区二区三区| 在线观看一区二区三区四区| 国产精品嫩模av在线| 欧美成人免费播放| 国产午夜麻豆影院在线观看| 精品亚洲成a人在线观看| 国内外成人免费视频| 无遮挡的视频在线观看| 亚洲国产精品久久一线不卡| 天天操天天爽天天射| 一区二区三区国产好| 亚洲网站在线播放| 日韩精品一区二区在线播放| 麻豆成人久久精品二区三区红| 国产精品久久亚洲| 秋霞成人影院| 日本精品视频一区二区三区| 欧美做受高潮中文字幕| 日韩精品久久久久久久电影99爱| 久久免费精品视频| 99精品在线看| 中日韩av电影| 国产精品后入内射日本在线观看| 在线观看欧美| 色阁综合伊人av| 天天操天天操天天操天天| 国产精品一级片在线观看| 日韩精品一区二区三区四区五区| www欧美xxxx| 5858s免费视频成人| 一区二区精品免费| 国产视频久久| 国产视频一区二区三区四区| www.久久ai| 欧美乱熟臀69xxxxxx| 中文字幕一二三四区| 日韩一级免费| 动漫精品视频| 丝袜国产在线| 欧美丰满高潮xxxx喷水动漫| 黄色av免费播放| 日韩和的一区二区| 麻豆av一区二区| 黄视频网站在线观看| 精品人在线二区三区| www.99re7| 国产精品资源在线观看| 国产一区一区三区| 99久久这里有精品| 美女精品视频一区| 99精品在线视频观看| 亚洲丝袜美腿综合| 亚洲综合在线一区二区| 99精品在线| 91在线播放国产| 黄色成人影院| 日韩一区二区电影在线| 青青草免费av| 成人免费视频一区二区| 日本精品久久久久久久久久| 国产精品毛片视频| 97国产suv精品一区二区62| 五月激情婷婷综合| 日韩欧美国产激情| 久久久久久久久久久久久久久| 丝袜国产日韩另类美女| 日本一区二区久久精品| 国产69精品久久久久按摩| 日韩一区二区三区xxxx| 99久久夜色精品国产亚洲| 亚洲在线视频免费观看| jizz日本免费| 日韩国产欧美在线观看| 中文字幕中文字幕一区三区| 日韩成人久久| 欧美一级视频免费在线观看| 国产精品免费播放| 欧美人与z0zoxxxx视频| 久久免费播放视频| 97精品久久久午夜一区二区三区| 8x8x最新地址| 午夜精品av| 欧美精品二区三区四区免费看视频| 欧美free嫩15| 欧美日韩第一页| 亚洲三区在线播放| 在线成人免费观看| 国产又黄又爽又色| 国产精品久久久久一区二区三区共| 麻豆网站免费观看| 亚洲欧美清纯在线制服| 综合视频免费看| 久久综合另类图片小说| 国产日本欧美一区二区三区在线| 污污的视频在线观看| 亚洲欧洲国产一区| 国产福利视频导航| 色综合久久中文字幕| 男人的天堂久久久| 国产日韩欧美亚洲| 国产亚洲精品成人a| 秋霞午夜鲁丝一区二区老狼| 国产欧美精品aaaaaa片| 精品国产一区二区三区四区| 国产精品久久亚洲| 99久久999| 国产精品电影网站| 国产不卡人人| 欧美激情精品久久久久久黑人| 久青草国产在线| 日韩一区二区电影| 久久亚洲AV无码| 久久久夜色精品亚洲| 黑人无套内谢中国美女| 性色一区二区三区| 男同互操gay射视频在线看| 精品国产乱码久久久久久果冻传媒 | 欧美白人最猛性xxxxx69交| 久久久久久久久久久久久av| 一区二区三区中文字幕| 亚洲国产天堂av| 成人小视频免费观看| 性欧美videossex精品| 99精品国产在热久久| 一区二区三区四区五区视频| 农村少妇一区二区三区四区五区| 成人h视频在线观看播放| 欧美电影网址| 欧美激情一区二区三区在线视频观看 | 欧美乱熟臀69xxxxxx| 五月婷婷视频在线| 香蕉加勒比综合久久| 精品国产精品国产精品| 国产色综合久久| 欧美日韩人妻精品一区在线| 大陆成人av片| 中文字幕色网站| 日韩电影在线观看电影| 国产乱子夫妻xx黑人xyx真爽| 中文字幕免费一区二区| 婷婷五月色综合| 美女久久久久| 欧美精品一区二区视频| 成人福利一区| 99国产在线| 国产精品一区二区精品视频观看| 国产在线拍偷自揄拍精品| 欧美××××黑人××性爽 | 日韩精品在线视频观看| 性生活视频软件| 日韩视频免费观看高清完整版在线观看 | 一区视频在线看| 欧美另类videosbestsex日本| 日韩免费高清| 色中色综合成人| 视频一区中文| 色一情一乱一伦一区二区三区丨| 你懂的一区二区三区| 日本不卡久久| 欧美伦理在线视频| 欧美一区二区三区在线免费观看| 成人毛片在线| 午夜精品亚洲一区二区三区嫩草| 精品国产一区二区三区| 日本中文不卡| 亚洲精品二区三区| 国产成人免费高清视频| 亚洲成人精选| 亚洲人成无码网站久久99热国产 | 国产 欧美在线| 国产高潮视频在线观看| 99视频超级精品| 久久人人爽人人爽人人片| 国产亚洲欧美日韩日本| 国产精品免费无码| 国产精品污网站| 少妇愉情理伦三级| 中文字幕综合网| 欧美精品乱码视频一二专区| 午夜久久久久久久久| 欧美不卡视频在线观看| 狠狠做深爱婷婷久久综合一区| 黄色污污视频软件| 欧美日韩中文字幕一区二区| 亚洲视频一区二区三区四区| 欧美高清一级片在线| 五月婷中文字幕| 国产亚洲在线播放| 毛片在线看片| 97婷婷涩涩精品一区| 久久久久久久| 国产在线观看91精品一区| 日本欧美一区| 国产精品二区在线观看| 羞羞色国产精品网站| 色一情一乱一伦一区二区三区丨| 欧美激情视频一区二区三区在线播放| 日韩成人三级视频| 久久经典综合| 老司机免费视频| 国产日本欧洲亚洲| 国产乱国产乱老熟300| 亚洲一区免费观看| 欧美亚洲另类小说| 日韩欧美激情在线| 欧美女优在线| 久久久久久国产免费| 一区二区视频免费完整版观看| 91久热免费在线视频| 国产尤物久久久| 伊人久久在线观看| 久久深夜福利| 欧美无人区码suv| 中文字幕在线一区免费| 亚洲精品午夜久久久久久久| 色老头久久综合| 日韩在线视频免费| 中文字幕一区电影| 77thz桃花论族在线观看| 91美女片黄在线观| 免费电影一区二区三区| 日本一本中文字幕| 国内外成人在线视频| av网站免费在线看| 亚洲一二三区不卡| 精品国产亚洲一区二区麻豆| 国产亚洲精品成人av久久ww| av丝袜在线| 成人免费视频网站| 91麻豆国产自产在线观看亚洲| 乱妇乱女熟妇熟女网站| 成人久久18免费网站麻豆| 可以免费看av的网址| 色欧美乱欧美15图片| 头脑特工队2在线播放| 九九精品在线观看| 久久婷婷五月综合色丁香| 欧美亚洲精品日韩| 怡红院精品视频在线观看极品| 国产三级生活片| 久久九九全国免费| 樱花视频在线免费观看| 亚洲精品国产欧美| gogo在线高清视频| 91综合免费在线| 欧美大黑bbbbbbbbb在线| 国产日韩一区二区在线| 99精品国产视频| 日本免费一二三区| 精品国产乱子伦一区| 免费在线观看av电影| 亚洲一区制服诱惑| 婷婷综合久久| 黄色片子免费看| 亚洲免费在线电影| 91精品国产综合久| 久久久999成人| 国产精品麻豆| 中文字幕日韩一区二区三区| 韩日欧美一区二区三区| 91久久久久久久久久久久久久| 色婷婷香蕉在线一区二区| 日韩a在线观看| 国产999在线| 婷婷成人基地| 国产不卡的av| 一区二区日韩av| 午夜小视频免费| 青青青国产精品一区二区| 亚洲老女人视频免费| 一区二区三区 欧美| 国产精品久久三区| 国产视频一区二区三区四区五区| 欧美国产中文字幕| 成人资源在线| 久久久久久www| 久久精品亚洲乱码伦伦中文| 国产精品尤物视频| 欧美成人一二三| 国产精品tv| 两根大肉大捧一进一出好爽视频| 欧美国产日韩精品免费观看| 中文字幕av网站| 另类天堂视频在线观看| 精品人人人人| 黑鬼大战白妞高潮喷白浆| 国产精品免费视频网站| 亚洲欧美另类综合| 欧美中文字幕在线视频| 一本色道久久综合亚洲精品酒店| www.亚洲高清| 亚洲精品乱码久久久久久| 亚洲国产精品无码久久| 538国产精品视频一区二区| jiujiure精品视频播放| 色婷婷狠狠18禁久久| 欧美日韩激情网| 日本在线观看www| 久久伊人一区| 激情图片小说一区| 久久久国产高清| 久久久99久久精品女同性| 999久久久精品一区二区| av在线网址导航| 亚洲一区二区三区四区在线观看 |