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

什么,你的EasyExcel導出一萬條數據就OOM了?

開發 前端
雖然這種方式不會出現OOM,但是每次導出都寫一遍重復的代碼著實有點麻煩,所以結合自己平時的使用場景,封裝了一個EasyExcel的導出工具類,這樣只要在分頁查詢的基礎上寫少量的代碼,就可以實現分批次寫入Excel,簡化代碼的編寫并且解決OOM的問題。

前言

前段時間在做一個導出的功能,本以為是平平無奇的一個功能。就用公司內部的一個導出工具類三下五除二就寫完了,做法是直接查全量數據,然后直接往Excel里寫。一開始沒多少數據也沒什么問題,但是當數據量逐漸多了起來后,達到一萬多條,導出的時候就會報OOM。然后我就換成了阿里開源的EasyExcel,但是導出的時候也不太穩定,偶爾也會OOM。所以應該是數據量太大了,在寫入的時候把內存占滿了。然后我就放棄了查全量數據一次性寫入Excel的做法,采用分頁查詢,分批次寫入Excel的方式,果然不會出現OOM了。

雖然這種方式不會出現OOM,但是每次導出都寫一遍重復的代碼著實有點麻煩,所以結合自己平時的使用場景,封裝了一個EasyExcel的導出工具類,這樣只要在分頁查詢的基礎上寫少量的代碼,就可以實現分批次寫入Excel,簡化代碼的編寫并且解決OOM的問題。

實現

@Slf4j
public abstract class EasyExcelExport<T, S> {

    /**
     * EasyExcel導出Excel表格,每個sheet默認最大10萬條數據
     *
     * @param fileName  excel文件前綴名
     * @param sheetName 表頁名
     */
    public void easyExcelBatchExport(String fileName, String sheetName, HttpServletResponse response) {
        this.easyExcelBatchExport(fileName, sheetName, 100000, response);
    }

    /**
     * 分批次導出excel數據
     *
     * @param fileName  excel文件前綴名
     * @param sheetSize 每個sheet的數據量,默認10萬,excel有限制不能大于1048576
     * @param sheetName 表頁名
     */
    public void easyExcelBatchExport(String fileName, String sheetName, Integer sheetSize, HttpServletResponse response) {
        fileName = fileName + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".xlsx";
        int currentSheet = 1;   // 當前處于第幾個sheet
        int totalLine = 0;      // 總共寫入的條數
        int currentBatch = 1;   // 當前寫入excel的批次(第幾頁)
        int lineNum = 1;        // 行號,當前寫入的是第幾條數據

        long startTime = System.currentTimeMillis();
        try {
            response.setCharacterEncoding("utf-8");
            // 告訴瀏覽器用什么軟件可以打開此文件
            response.setHeader("content-Type", "application/vnd.ms-excel");
            // 下載文件的默認名稱
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));

            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]).build();
            WriteSheet sheet = EasyExcel.writerSheet(sheetName).build();

            while (true) {
                // 獲取數據,然后currentBatch+1,下次調用就會獲取新的數據
                List<S> sourceDataList = getData(currentBatch);
                currentBatch++;

                List<T> exportEntityList = new ArrayList<>();
                if (CollUtil.isNotEmpty(sourceDataList)) {
                    totalLine += sourceDataList.size();
                    log.info("EasyExcel開始寫入第{}批數據,當前批次數據大小為{}", currentBatch - 1, sourceDataList.size());
                    for (S sourceData : sourceDataList) {
                        exportEntityList.add(convertSourceData2ExportEntity(sourceData, lineNum));
                        lineNum++;

                        // 當前sheet數據已經到達最大值,將當前數據全寫入當前sheet,下一條數據就會寫入新sheet
                        if (lineNum > sheetSize) {
                            excelWriter.write(exportEntityList, sheet);
                            exportEntityList.clear();
                            lineNum = 1;
                            currentSheet++;
                            sheet = EasyExcel.writerSheet(sheetName + currentSheet).build();
                        }
                    }

                    // 寫入excel
                    excelWriter.write(exportEntityList, sheet);
                } else {
                    // 未獲取到數據,結束
                    break;
                }
            }
            excelWriter.finish();
        } catch (Exception e) {
            log.error("EasyExcel導出異常", e);
        }

        log.info("EasyExcel導出數據結束,總數據量為{},耗時{}ms", totalLine, (System.currentTimeMillis() - startTime));
    }

    /**
     * 不分批次導出excel。一次性獲取所有數據寫入excel,確定數據量不大時可以使用該方法,數據量過大時使用分批次導出,否則會OOM
     *
     * @param fileName  excel文件前綴名
     * @param sheetName 表頁名
     */
    public void easyExcelExport(String fileName, String sheetName, HttpServletResponse response) {
        fileName = fileName + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".xlsx";
        int totalLine = 0;      // 總共寫入的條數
        int lineNum = 1;        // 行號,當前寫入的是第幾條數據

        long startTime = System.currentTimeMillis();
        try {
            response.setCharacterEncoding("utf-8");
            // 告訴瀏覽器用什么軟件可以打開此文件
            response.setHeader("content-Type", "application/vnd.ms-excel");
            // 下載文件的默認名稱
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));

            List<S> sourceDataList = getData(1);
            List<T> exportEntityList = new ArrayList<>();
            if (CollUtil.isNotEmpty(sourceDataList)) {
                totalLine += sourceDataList.size();
                log.info("EasyExcel開始寫入數據,數據大小為{}", sourceDataList.size());
                for (S sourceData : sourceDataList) {
                    exportEntityList.add(convertSourceData2ExportEntity(sourceData, lineNum));
                    lineNum++;
                }
            }
            response.setCharacterEncoding("utf-8");
            // 告訴瀏覽器用什么軟件可以打開此文件
            response.setHeader("content-Type", "application/vnd.ms-excel");
            // 下載文件的默認名稱
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
            EasyExcel.write(response.getOutputStream(), (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]).sheet(sheetName).doWrite(exportEntityList);
        } catch (Exception e) {
            log.error("EasyExcel導出異常", e);
        }

        log.info("EasyExcel導出數據結束,總數據量為{},耗時{}ms", totalLine, (System.currentTimeMillis() - startTime));
    }

    /**
     * 將原數據對象轉換為需要導出的目標對象
     *
     * @param sourceData 原對象
     * @param lineNum    行號
     */
    public abstract T convertSourceData2ExportEntity(S sourceData, Integer lineNum);

    /**
     * 獲取原始數據,通過currentBatch參數分頁獲取數據。
     *
     * @param currentBatch 獲取第幾批(頁)數據,通過該參數分頁查詢,每次調用自動遞增。不分批次導出時可以忽略該參數
     */
    public abstract List<S> getData(int currentBatch);

}

首先,這是EasyExcelExport是一個抽象類,指定了泛型 T  S,T是target目標類,也就是導出時對應的類,S是source原對象所對應的類。

EasyExcelExport里還有兩個抽象方法,getData()  convertSourceData2ExportEntity() 。這兩個方法是需要在平時使用時自己去實現的,getData是數據查詢的方法,可以在這里面去實現分頁查詢的邏輯,currentBatch參數是用來控制分頁查詢頁碼的,從1開始,會自動遞增。如果確定數據量不大不需要分批次導出的話,那么getData()里只需要進行普通的查詢即可,忽略currentBatch參數不用分頁查詢。還有一個方法是convertSourceData2ExportEntity(),這個是用來將對象S轉為對象T的方法,因為從數據庫查詢或者是從其他地方獲取到的對象類型可能是S,而導出時需要的對象類型是T,所以通過該方法進行對象轉換。

最核心的是 easyExcelBatchExport() 方法,里面有一個while循環,while循環里首先會去調用getData()方法獲取數據,然后將currentBatch加1便于下次獲取數據,接下來有個for循環去進行對象的轉換并添加到exportEntityList集合中,這個集合中裝的是最終寫到Excel里的對象。當轉換完成后就將當前批次的數據寫入Excel中,然后進行下一次循環,當getData()方法未獲取到數據時,就結束循環。

同時支持指定每個sheet頁的最大行數。在對對象進行轉換時有一個判斷,當前sheet頁的數據是否到達指定值,到達后,直接寫入excel,然后新建一個sheet頁,這樣新的數據就會寫入新的sheet頁。

使用

那么如何使用這個工具類呢。很簡單,只要new出EasyExcelExport的對象,然后實現一下 convertSourceData2ExportEntity() 方法和 getData() 方法即可,然后再根據需要去調用不同的導出方法即可。導出方法有指定和不指定sheet數據頁大小的分批寫入方法 easyExcelBatchExport() 和不分批次直接一次性寫入的 easyExcelExport() 方法。

下面通過一個小案例展示一下。假設現在有個導出用戶列表的需求,數據庫User表對應的是UserPO類:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserPO {

    private Long id;

    /**
     * 用戶編號
     */
    private String code;

    /**
     * 姓名
     */
    private String name;

    /**
     * 手機號碼
     */
    private String phone;

    /**
     * 性別。1-男,2-女
     */
    private Integer sex;

}

導出對應的類是UserExportEntity:

@Data
public class UserExportEntity {

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 0, value = "序號")
    private Integer line;

    @ColumnWidth(35)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 1, value = "用戶編號")
    private String code;

    @ColumnWidth(35)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 2, value = "姓名")
    private String name;

    @ColumnWidth(35)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 3, value = "手機號碼")
    private String phone;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 4, value = "性別")
    private String sexStr;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 5, value = "fieldA")
    private String fieldA;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 6, value = "fieldB")
    private String fieldB;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 7, value = "fieldC")
    private String fieldC;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 8, value = "fieldD")
    private String fieldD;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 9, value = "fieldE")
    private String fieldE;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 10, value = "fieldF")
    private String fieldF;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 11, value = "fieldG")
    private String fieldG;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 12, value = "fieldH")
    private String fieldH;

    @ColumnWidth(10)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(index = 13, value = "fieldI")
    private String fieldI;

}

先測試一下不分批次導出,導出123456條數據。

@GetMapping("/testExport")
    public void testExport(HttpServletResponse response) {
        new EasyExcelExport<UserExportEntity, UserPO>() {
            @Override
            public UserExportEntity convertSourceData2ExportEntity(UserPO sourceData, Integer lineNum) {
                UserExportEntity entity = new UserExportEntity();
                entity.setLine(lineNum);
                entity.setCode(sourceData.getCode());
                entity.setName(sourceData.getName());
                entity.setPhone(sourceData.getPhone());
                entity.setSexStr(Objects.equals(sourceData.getSex(), 1) ? "男" : Objects.equals(sourceData.getSex(), 2) ? "女" : StrUtil.EMPTY);
                return entity;
            }

            @Override
            public List<UserPO> getData(int currentBatch) {
                List<UserPO> userPOList = new ArrayList<>();
                // 模擬查詢數據庫,假設每次查詢會查出123456條數據
                for (int i = 0; i < 123456; i++) {
                    userPOList.add(UserPO.builder()
                            .code("USER_" + RandomUtil.randomString("1234567890", 6))
                            .name(RandomUtil.randomString("qwertyuiopasdfghjklzxcvbnm", 10))
                            .phone("138" + RandomUtil.randomString("1234567890", 8))
                            .sex(RandomUtil.randomInt(1, 3))
                            .build());
                }
                log.info("userPOList-->{}", JSONUtil.toJsonStr(userPOList));
                return userPOList;
            }
        }.easyExcelExport("測試不分批次導出", "測試不分批次導出", response);
    }

為了更清晰地看到效果,我將內存大小限制為128M。

調用一下測試接口,可以看到,導出十幾萬條數據時發生了OOM。

再來看看分批次導出的效果,模擬一下分頁查詢,假設有200頁數據,每頁8888條,一共是170多萬條數據。

@GetMapping("/testBatchExport")
    public void testBatchExport(HttpServletResponse response) {
        new EasyExcelExport<UserExportEntity, UserPO>() {
            @Override
            public UserExportEntity convertSourceData2ExportEntity(UserPO sourceData, Integer lineNum) {
                UserExportEntity entity = new UserExportEntity();
                entity.setLine(lineNum);
                entity.setCode(sourceData.getCode());
                entity.setName(sourceData.getName());
                entity.setPhone(sourceData.getPhone());
                entity.setSexStr(Objects.equals(sourceData.getSex(), 1) ? "男" : Objects.equals(sourceData.getSex(), 2) ? "女" : StrUtil.EMPTY);
                return entity;
            }

            @Override
            public List<UserPO> getData(int currentBatch) {
                // 模擬分頁查詢,假設數據庫中有200頁數據
                if (currentBatch <= 200) {
                    List<UserPO> userPOList = new ArrayList<>();
                    // 模擬查詢數據庫,假設每次查詢會查出8888條數據
                    for (int i = 0; i < 8888; i++) {
                        userPOList.add(UserPO.builder()
                                .code("USER_" + RandomUtil.randomString("1234567890", 6))
                                .name(RandomUtil.randomString("qwertyuiopasdfghjklzxcvbnm", 10))
                                .phone("138" + RandomUtil.randomString("1234567890", 8))
                                .sex(RandomUtil.randomInt(1, 3))
                                .build());
                    }
                    return userPOList;
                } else {
                    return new ArrayList<>();
                }
            }
        }.easyExcelBatchExport("測試分批次導出", "測試分批次導出", response);
    }

通過分批次寫入Excel的方式,成功導出了170多萬條數據,相較于不分批次導出,效果顯而易見。而且通過調用工具類的方式,進一步簡化了導出時代碼的編寫。

責任編輯:武曉燕 來源: Robod
相關推薦

2019-07-16 08:51:03

熱搜新浪微博數據

2018-04-11 09:50:04

大數據

2018-04-02 10:58:28

大數據sqoop大數據項目

2024-11-04 09:41:47

2017-10-21 10:37:28

2025-09-01 01:45:00

數據虛擬列表

2011-03-31 11:24:14

數據搜索本文字段

2023-10-19 15:13:25

2021-11-02 14:46:50

數據

2019-11-28 18:54:50

數據庫黑客軟件

2022-04-28 20:12:44

二分法搜索算法

2025-02-11 16:11:12

2019-12-19 17:00:01

Java線程

2019-06-05 15:20:00

MongoDBNoSQL數據庫

2018-08-27 07:01:33

數據分析數據可視化租房

2019-12-25 10:45:30

Java悲觀鎖

2022-02-25 07:07:04

擴展塢電腦筆記本

2017-07-22 22:11:36

數據丟失操作

2022-10-27 21:32:28

數據互聯網數據中心

2025-05-09 10:01:06

EasyExcelMySQLMySQL8
點贊
收藏

51CTO技術棧公眾號

亚洲人成啪啪网站| 日韩欧美在线字幕| 国产综合动作在线观看| 免费黄色av片| 一区二区三区网站| 亚洲国产精品va在线看黑人| 亚洲精品一二三四五区| 国产cdts系列另类在线观看| fc2成人免费人成在线观看播放| 欧美一级片在线播放| 特黄一区二区三区| 精品成人自拍视频| 欧美老女人在线| 成年人视频网站免费观看| 国产午夜精品久久久久免费视| 国产99精品国产| 国产精品久久久久一区二区| 国产一级特黄毛片| 久久中文字幕二区| 亚洲美女在线视频| 在线中文字日产幕| 91九色成人| 在线国产亚洲欧美| 国产二级片在线观看| 含羞草www国产在线视频| 91丨九色丨蝌蚪丨老版| 亚洲综合日韩在线| 中文字幕第一页在线播放| 亚洲日本黄色| 九九热这里只有在线精品视| 免费成人深夜天涯网站| 六月丁香久久丫| 日韩欧美一卡二卡| 国产精欧美一区二区三区白种人| 欧美黑人巨大xxxxx| 亚洲成人午夜电影| 欧美高清中文字幕| 国产精品久久麻豆| 日本一区免费视频| 日本黄网免费一区二区精品| 五月婷中文字幕| 成人激情午夜影院| 成人免费在线一区二区三区| 国产视频在线观看视频| 精品影院一区二区久久久| 国产精品女人久久久久久| 亚洲国产av一区二区三区| 中文亚洲字幕| 8x拔播拔播x8国产精品| 免费毛片一区二区三区| 狠狠88综合久久久久综合网| 欧美成人sm免费视频| 午夜激情福利网| 91精品1区| 不卡毛片在线看| 亚洲欧美小视频| 中文字幕一区二区三区在线视频| 久久精品亚洲一区| 国产一区二区视频在线观看免费| 国产高清一区二区| 操日韩av在线电影| 免费一级肉体全黄毛片| 亚洲性色视频| 97超级碰在线看视频免费在线看| 国产乡下妇女做爰| 亚洲美女视频在线免费观看 | 国产探花视频在线播放| 青青草综合网| 日韩网站免费观看高清| 国产高清视频免费在线观看| 中文字幕一区二区av| 国内偷自视频区视频综合| 国产成人精品一区二三区| 欧美亚洲三区| 国产精品中文字幕久久久| 国产精品久久久久久久久毛片 | 国产日韩av在线| 国产精品无码AV| 国产成人综合在线观看| 国模一区二区三区私拍视频| 九色视频在线观看免费播放| 国产精品三级在线观看| 日本中文字幕一级片| 丁香花高清在线观看完整版| 欧美午夜视频一区二区| 精品亚洲一区二区三区四区| 日韩高清在线观看一区二区| 精品日韩成人av| 丰满少妇一区二区| 99久久亚洲精品蜜臀| 欧美高清在线播放| 五月婷婷激情视频| 国产乱色国产精品免费视频| 国产一区二区免费在线观看| 国产系列电影在线播放网址| 亚洲色图在线播放| 久久成人免费观看| 久久99国产精品二区高清软件| 日韩欧美国产一区在线观看| 免费观看av网站| 婷婷丁香综合| 欧美怡春院一区二区三区| 一级片在线观看视频| 波多野结衣中文字幕一区| 欧美日韩亚洲免费| 18+视频在线观看| 色婷婷精品大视频在线蜜桃视频| 波多野结衣在线免费观看| 亚洲欧美tv| 欧美人成在线视频| 一二三四区视频| 91亚洲国产成人精品一区二三 | 天天躁日日躁狠狠躁av| 欧美少妇xxxx| 欧美一级片在线播放| 国产不卡精品视频| 国产精品情趣视频| 久久无码高潮喷水| 国产一区福利| 久久99精品久久久久久琪琪| 中国女人一级一次看片| av中文一区二区三区| 久久久成人精品一区二区三区| 亚洲天堂导航| 欧美成人精品高清在线播放| 国产又黄又粗又猛又爽的| 久久精品毛片| 国产视频在线观看一区| 最新av在线播放| 欧美日韩精品一区二区三区蜜桃 | 亚洲国产精品一| 综合欧美亚洲日本| 天天干在线影院| 免费看成人吃奶视频在线| 韩剧1988在线观看免费完整版 | 日韩av一区二区在线观看| 日本精品在线免费观看| 日本不卡一二三区黄网| 欧美区高清在线| 午夜激情在线播放| 亚洲国产婷婷香蕉久久久久久| √天堂中文官网8在线| 欧美aⅴ一区二区三区视频| 欧美日韩在线高清| 欧美黑人疯狂性受xxxxx野外| 日韩av在线电影网| 日本一区二区不卡在线| 成人免费毛片片v| 激情六月天婷婷| 日韩精品一区二区三区中文字幕| 久久最新资源网| 国产精品日韩无码| 综合色天天鬼久久鬼色| 91性高潮久久久久久久| 欧美日本一区| av成人午夜| 久久香蕉av| 亚洲精品电影网| 老熟妇仑乱一区二区av| 国产午夜一区二区三区| 国产wwwxx| 香蕉国产精品| dy888夜精品国产专区| 国产精品69xx| 国产视频精品免费播放| 69xxxx国产| 国产精品久久久久久久浪潮网站| 久久人人爽av| 欧美破处大片在线视频| 国产美女99p| 成人性生交大片免费观看网站| 亚洲视频网站在线观看| 伊人久久亚洲综合| 亚洲男人都懂的| 97精品人妻一区二区三区蜜桃| 国产精品普通话对白| 欧美一区免费视频| 成人精品视频在线观看| 欧美精品www在线观看| 午夜视频在线免费播放| 91福利国产成人精品照片| 毛片视频免费播放| 国产激情偷乱视频一区二区三区| 成人一区二区免费视频| 国产在线观看91一区二区三区| 国产欧美va欧美va香蕉在| 欧美wwww| 一区二区三区视频在线 | 亚洲精品国产拍免费91在线| 亚洲成人av影片| 亚洲欧美国产77777| 国产精品无码一区二区三| 日本怡春院一区二区| 精品日韩在线播放| 天堂综合网久久| 91精品久久久久久久久不口人| 欧美wwww| xvideos国产精品| 天堂在线免费av| 欧美一区二区三区的| 无码人妻aⅴ一区二区三区有奶水| 亚洲天堂av老司机| 精品少妇人妻一区二区黑料社区| 国产美女精品一区二区三区| 国产精品丝袜久久久久久消防器材| 日本欧美视频| 精品久久蜜桃| 九九99久久精品在免费线bt| 国产成人一区二| 电影k8一区二区三区久久| 一区二区三区四区视频| 五月婷婷开心中文字幕| 欧美一级片在线| 国产精品尤物视频| 午夜精品福利一区二区蜜股av| www.99re6| 国产日韩欧美电影| 中文字幕在线永久| 国产精品综合在线视频| 天天视频天天爽| 欧美资源在线| 欧美精品一区二区三区三州| 亚洲高清影视| 亚洲不卡一卡2卡三卡4卡5卡精品| 综合成人在线| 成人免费黄色网| 69堂免费精品视频在线播放| 91爱视频在线| h片视频在线观看| 另类图片亚洲另类| 国产一二区在线| 久久亚洲精品网站| √新版天堂资源在线资源| 亚洲免费人成在线视频观看| 日本精品久久久久| 亚洲成人中文字幕| xxxx国产精品| 日韩欧美国产午夜精品| 国产精品视频一二区| 欧美日精品一区视频| www.av88| 欧美日韩在线精品一区二区三区激情| 国产午夜麻豆影院在线观看| 日韩欧美国产网站| av大全在线观看| 色婷婷精品久久二区二区蜜臀av| 成人午夜视频在线播放| 欧美日韩性视频| 亚洲欧美偷拍视频| 色综合久久久久久久久久久| 男人天堂2024| 欧洲一区二区av| 国产一区二区小视频| 欧美丰满嫩嫩电影| 99国产成人精品| 日韩视频在线观看一区二区| www.色呦呦| 亚洲第一页自拍| 青青青手机在线视频观看| 亚洲精品永久免费精品| 久久国产精品高清一区二区三区| 国产一区二区日韩| 久久久久久久久免费视频| 欧美成人午夜激情在线| 青草青在线视频| 欧美孕妇与黑人孕交| 久久久成人av毛片免费观看| 国产精品视频网址| 精品久久亚洲| 激情一区二区三区| 欧美日韩水蜜桃| 国产麻豆电影在线观看| 国产综合婷婷| 激情婷婷综合网| 激情综合色综合久久综合| 潘金莲一级淫片aaaaa| 91亚洲男人天堂| 亚洲色图27p| 亚洲国产精品一区二区www| 国产精品999在线观看| 欧美在线啊v一区| 国产黄色片免费| 亚洲精选中文字幕| 毛片免费不卡| 97在线视频免费观看| 精品3atv在线视频| 亚洲自拍偷拍区| 亚洲丝袜啪啪| 久久久无码中文字幕久...| 日韩午夜高潮| 日本国产一级片| 99精品国产91久久久久久| 少妇视频一区二区| 欧美日韩免费看| 国产精品伊人久久| 国产丝袜一区视频在线观看| 欧美成人视屏| 欧美一区二区影院| 日韩精品一区二区三区免费视频| 免费中文日韩| 欧美午夜在线视频| 亚洲国产精品三区| 不卡电影免费在线播放一区| 久久久久人妻一区精品色| 精品久久久久久久久久久久| 一区二区的视频| 亚洲精品在线观看www| 羞羞的视频在线看| 91精品免费看| 久久最新网址| 日韩五码在线观看| 国产成人综合在线播放| 五月婷婷六月香| 色88888久久久久久影院野外 | 亚洲毛茸茸少妇高潮呻吟| 直接在线观看的三级网址| 国产精品av免费在线观看| 国产成人高清精品免费5388| 吴梦梦av在线| 麻豆一区二区三| 天天躁日日躁aaaxxⅹ| 亚洲一区二区影院| 精品久久久无码中文字幕| 中文字幕视频在线免费欧美日韩综合在线看| bl在线肉h视频大尺度| 91精品综合久久久久久五月天| 久久最新网址| 日韩欧美精品在线观看视频| proumb性欧美在线观看| 精品少妇久久久| 日韩一区二区免费电影| 免费a级人成a大片在线观看| 国产精品99久久久久久白浆小说| 日韩精品导航| 欧美黑人经典片免费观看| 国产91色综合久久免费分享| 永久久久久久久| 欧美一区二区精品久久911| 黄在线免费看| 91亚洲va在线va天堂va国 | 国产精品一二三四五区| 尤物精品国产第一福利三区| 日韩精品影院| 日韩免费电影一区二区| 日日夜夜免费精品| 91精品人妻一区二区三区蜜桃欧美| 精品久久久久久久久久久| 色视频免费在线观看| 欧洲午夜精品久久久| 亚洲精品亚洲人成在线| 男人亚洲天堂网| 久久久久久久久一| 奴色虐av一区二区三区| 伊人久久精品视频| 精品久久99| 激情视频小说图片| 国产99久久久久| 国产微拍精品一区| 亚洲色图国产精品| 成人做爰免费视频免费看| 亚洲永久激情精品| 经典三级在线一区| 欧美片一区二区| 亚洲精品美女视频| 韩日一区二区| 成人在线观看www| 成人一区在线观看| 日本免费在线观看视频| 在线日韩欧美视频| 精品视频91| 大陆极品少妇内射aaaaa| 久久久蜜臀国产一区二区| 伊人久久一区二区| 欧美高跟鞋交xxxxxhd| 亚洲人成网77777色在线播放| 成人中文字幕av| 亚洲女女做受ⅹxx高潮| 性欧美8khd高清极品| 欧美在线一区二区视频| 日韩一区电影| 久草视频福利在线| 欧洲一区二区三区在线| 三级网站视频在在线播放| 欧美激情一区二区三区在线视频| 蜜臀av性久久久久av蜜臀妖精| 欧美国产日韩在线观看成人| 亚洲精品视频免费在线观看| 免费视频观看成人| 欧美精品卡一卡二| 欧美国产成人精品| 成人午夜精品福利免费| 国产精品xxx视频| 欧美精品一线| 亚洲一区二区自偷自拍| 日韩欧美区一区二| 午夜精品成人av| 久久久久99精品成人片| 中文字幕欧美日韩一区| 噜噜噜久久,亚洲精品国产品| 国产精品自在线|