精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

久久综合成人精品亚洲另类欧美 | 欧美gv在线| 91在线视频官网| 国产精品欧美一区二区| 午夜精品一区二区三区视频| 韩国女主播一区二区三区| 色呦呦网站一区| 大桥未久一区二区三区| 国产精品国产高清国产| 久久国产视频网| 97碰碰碰免费色视频| 黄色一级片一级片| 日韩精品丝袜美腿| 欧美一区二区国产| 88av.com| 久久男人av资源站| 亚洲免费观看高清在线观看| 免费看成人片| 黄色小视频免费在线观看| 免费看欧美女人艹b| 国模精品一区二区三区色天香| 精品国产aaa| 精品在线网站观看| 91精品麻豆日日躁夜夜躁| 777米奇影视第四色| 亚洲男同gay网站| 国产精品免费av| 久久精品综合一区| 亚洲精品久久久久久久久久久久久久| 日韩综合在线视频| 久久久久久久久爱| 神马午夜精品91| 日韩免费久久| 亚洲人成网站免费播放| 日本性生活一级片| 精品一区二区三区免费看| 欧美私模裸体表演在线观看| 18岁网站在线观看| 成人福利影视| 亚洲精品久久久蜜桃| 伊人色综合影院| 福利视频在线看| 久久夜色精品一区| 久久99精品久久久久久久久久 | 成人毛片在线观看| 91九色蝌蚪嫩草| 国产乱叫456在线| 精品一区二区三区免费毛片爱 | 爱高潮www亚洲精品| 在线播放国产精品二区一二区四区| 性生交免费视频| 成人mm视频在线观看| 欧美午夜寂寞影院| 亚洲欧美国产日韩综合| 深夜成人福利| 欧美自拍丝袜亚洲| 国产九九热视频| 亚洲成人a级片| 欧美精品aⅴ在线视频| 黄色一级片免费的| 亚洲天堂网站| 日韩视频免费观看高清完整版 | 91精品国产成人| 日本在线视频免费观看| 99日韩精品| 国产成人精品久久| 中文字幕乱码中文字幕| 精品一区二区三区香蕉蜜桃| 3d动漫精品啪啪一区二区三区免费 | 欧美区亚洲区| 久久久亚洲精选| 国产原创视频在线| 日本特黄久久久高潮| 国产欧美精品久久久| 99这里有精品视频| 成人一区二区三区| 久久久www免费人成黑人精品| 国产在线黄色| 亚洲欧美日韩一区二区三区在线观看| 狠狠精品干练久久久无码中文字幕 | 欧美高清自拍一区| 日本一级黄色大片| 日韩国产精品91| 亚洲va久久久噜噜噜久久天堂| 亚洲精品字幕在线| 久久久另类综合| 国产日本欧美在线| 极品在线视频| 欧美日韩免费在线视频| 性生交大片免费看l| 丝袜连裤袜欧美激情日韩| 国产一区二区三区在线播放免费观看 | 亚洲AV无码成人片在线观看| 91丨九色丨蝌蚪丨老版| 一区二区三区欧美在线| 草美女在线观看| 欧美视频一区二区三区在线观看| 99999精品| 亚洲宅男一区| 欧美激情网友自拍| 精品一区二三区| 国产成人av电影在线观看| 欧美日产一区二区三区在线观看| 黄av在线免费观看| 欧美视频在线观看免费| 初高中福利视频网站| 国产精品探花在线观看| 欧美老少配视频| 久久精品五月天| www.日本不卡| 色婷婷777777仙踪林| 偷拍中文亚洲欧美动漫| 精品国产一区二区三区四区四 | 免费av网站观看| 国产精品久久久一本精品| 日本网站免费在线观看| 日韩精品一区国产| 最近2019中文字幕第三页视频| 日本少妇做爰全过程毛片| 狠狠v欧美v日韩v亚洲ⅴ| 欧美污视频久久久| а√在线中文在线新版| 欧美一级电影网站| 夜夜春很很躁夜夜躁| 午夜一区在线| 国产伦精品一区二区三区四区视频| 欧美一区二区三区| 在线观看亚洲精品| 亚洲欧美视频在线播放| 极品av少妇一区二区| 92国产精品视频| 黄视频网站在线| 欧美日韩大陆在线| 超碰97av在线| 免费在线观看不卡| 日韩国产精品一区二区三区| 校园春色亚洲| 精品一区二区三区电影| 国产精品成人国产乱| 国产suv精品一区二区三区| 中文字幕在线亚洲三区| 另类中文字幕国产精品| 亚洲网站在线看| 久久久久久亚洲av无码专区| 91麻豆视频网站| 欧美三级一级片| 亚洲区小说区图片区qvod| 91精品国产成人www| 亚洲欧洲视频在线观看| 精品女同一区二区三区在线播放| 中文字幕在线永久| 国产亚洲在线观看| 精品视频一区二区三区四区| 久久男人天堂| 亚洲色图13p| 中文字幕在线2018| 国产精品传媒入口麻豆| 小日子的在线观看免费第8集| 在线精品小视频| 国产传媒一区二区| 高清电影在线免费观看| 亚洲精品国产综合久久| 美女又爽又黄免费视频| 欧美极品xxx| 国产精品久久久久久9999| 欧美久久成人| 国内不卡一区二区三区| 欧美中文字幕精在线不卡| 在线观看欧美日韩国产| 97精品人妻一区二区三区香蕉| 综合久久国产九一剧情麻豆| 国产无套精品一区二区三区| 99re国产精品| 亚洲va韩国va欧美va精四季| 热久久久久久| 欧美激情国产高清| 欧美男男同志| 制服丝袜av成人在线看| 国产稀缺真实呦乱在线| 久久久久久久综合日本| 女人高潮一级片| 亚洲黄网站黄| 亚洲国产精品久久久久婷婷老年 | 国产欧美日韩一区| 亚洲精品日产| 日韩亚洲精品视频| 午夜久久久久久噜噜噜噜| 高跟丝袜欧美一区| 国产人与禽zoz0性伦| 国产91精品久久久久久久网曝门| 3d动漫一区二区三区| 日韩国产欧美| 激情小说网站亚洲综合网| 精品69视频一区二区三区| 久久欧美在线电影| 伊人在线视频| 亚洲精品一区在线观看| 91久久久久国产一区二区| 婷婷丁香激情综合| √天堂中文官网8在线| 91亚洲国产成人精品一区二区三 | 国产伦精品一区二区三区在线播放| 国产精品国语对白| 国产桃色电影在线播放| 中文字幕在线亚洲| 亚洲 另类 春色 国产| 在线播放中文一区| 波多野结衣人妻| 亚洲国产毛片aaaaa无费看| 国产三级精品三级观看| 91农村精品一区二区在线| 99久久综合网| 久久精品999| 50路60路老熟妇啪啪| 影音先锋在线一区| 少妇熟女一区二区| 精品日韩毛片| 久久精品欧美| baoyu135国产精品免费| 国产精品丝袜久久久久久不卡| av在线中出| 九九热视频这里只有精品| 调教视频免费在线观看| 亚洲欧美一区二区三区在线| 欧美一级淫片免费视频魅影视频| 在线不卡中文字幕| 中文字幕免费播放| 色8久久人人97超碰香蕉987| 国产福利拍拍拍| 夜夜操天天操亚洲| 一区二区三区影视| 国产精品嫩草99a| 色综合99久久久无码国产精品| 2022国产精品视频| 91av在线免费| av网站一区二区三区| 色哟哟网站在线观看| 国产精品白丝av| 精产国品一区二区三区| 久久成人久久爱| 亚洲综合激情视频| 久久精品国产亚洲aⅴ| 特级丰满少妇一级| 蜜臀久久久99精品久久久久久| 日本va中文字幕| 日韩成人dvd| 网站一区二区三区| 老司机免费视频一区二区三区| 狠狠躁狠狠躁视频专区| 美女视频黄a大片欧美| 天天操天天爱天天爽| 麻豆精品一区二区综合av| 中文字幕在线导航| 久久成人免费电影| 欧美成人手机在线视频| 国产在线精品不卡| 成人性生交视频免费观看| 国产一本一道久久香蕉| 粗大的内捧猛烈进出视频| 成人精品国产免费网站| 亚洲精品在线视频免费观看| 久久影院午夜论| 亚洲色图欧美色| 亚洲手机成人高清视频| 久操视频免费在线观看| 欧美日韩免费区域视频在线观看| 亚洲婷婷综合网| 欧美日韩一级二级三级| 国产日韩一级片| 亚洲国产精久久久久久久| 日本午夜在线视频| 色综久久综合桃花网| 成人在线观看免费网站| 久久久久久久久久久免费精品| 欧美男男tv网站在线播放| 国产精品成人免费电影| 国产一区二区在线观| 国产欧美日韩在线播放| 欧美亚洲国产激情| 大桥未久一区二区| 亚洲黄色av| 国产三级三级看三级| 国产高清久久久久| 日本一级免费视频| 亚洲日本青草视频在线怡红院 | av网站在线免费看推荐| 欧美精品久久久久| 日韩成人高清| 99在线观看| av一区二区高清| www.xxx麻豆| 六月丁香婷婷久久| 2一3sex性hd| 亚洲欧美综合在线精品| 免费毛片一区二区三区| 欧美视频中文字幕| 刘亦菲毛片一区二区三区| 中文字幕欧美精品日韩中文字幕| 免费在线国产视频| 国产精品电影一区| 成人影院中文字幕| 杨幂一区欧美专区| 乱码第一页成人| 国产伦精品一区二区免费| 国产欧美一区二区精品性色超碰| 久久久久久福利| 欧美另类变人与禽xxxxx| 牛牛澡牛牛爽一区二区| 欧美日韩国产成人在线| 久久精品97| 欧美日韩一区二区三区在线视频 | 亚洲精品videosex极品| 黄色av网站免费| 亚洲国产日韩一区| 亚洲综合影视| 国产日韩在线精品av| 在线成人动漫av| 国产精品裸体瑜伽视频| 高清国产午夜精品久久久久久| 呻吟揉丰满对白91乃国产区| 欧美视频在线观看免费| 无码国产色欲xxxx视频| 欧美风情在线观看| 二区三区精品| 伊人色综合影院| 久久精品国产精品亚洲红杏 | 亚洲精品中文在线影院| 岳乳丰满一区二区三区| 亚洲欧美国产日韩天堂区| 17videosex性欧美| 不卡视频一区二区三区| 一二三区不卡| 91pony九色| 国产精品久久网站| 亚洲一区二区三区高清视频| 一个人看的www久久| 欧美日韩不卡| 日韩一区国产在线观看| 老妇喷水一区二区三区| 特大黑人巨人吊xxxx| 午夜私人影院久久久久| 黄色www视频| 97色在线观看| 特黄特色欧美大片| aa在线免费观看| 久久一区二区视频| 无码人妻av免费一区二区三区| 亚洲欧美中文在线视频| 成人天堂yy6080亚洲高清 | 亚洲二区三区不卡| 日韩av片免费观看| 一区二区三区四区中文字幕| 午夜精品久久久久久久爽| 久久久久久久久久久成人| 欧美午夜寂寞| 国产九九在线视频| 国产精品三级视频| 国产又粗又黄又爽的视频| 美日韩精品视频免费看| 亚洲一区二区三区日本久久九| 日韩黄色短视频| 久久综合色之久久综合| 久久久久精彩视频| 日韩在线中文视频| 亚洲91网站| 5月婷婷6月丁香| 亚洲国产精品精华液ab| 国产男男gay网站| 久久久久免费视频| 亚洲ab电影| 一女二男3p波多野结衣| 一区二区三区精品视频| 天天在线女人的天堂视频| 国产国语videosex另类| 亚洲精品一区二区在线看| 亚洲欧美综合视频| 日韩欧美在线一区| 91av资源在线| 国产99在线播放| 三级欧美在线一区| 国产老头老太做爰视频| 亚洲国产91色在线| 国产精成人品2018| 成人精品视频在线播放| 国产喷白浆一区二区三区| www.超碰在线.com| 日韩av大片免费看| 欧美在线三区| 一级黄色片大全| 欧美一级专区免费大片| 刘亦菲一区二区三区免费看| 久久久成人精品一区二区三区| 91免费版在线看| 国产富婆一级全黄大片| 日韩av日韩在线观看| 中文字幕人成人乱码| 全黄一级裸体片| 欧美大片在线观看| 日本一区二区三区视频在线| 好吊色视频988gao在线观看|