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

Spring Boot 一個接口實現任意表的 Excel 導入導出

開發 前端
Java的web開發需要excel的導入導出工具,所以需要一定的工具類實現,如果是使用easypoi、Hutool導入導出excel,會非常的損耗內存,因此可以嘗試使用easyexcel解決大數據量的數據的導入導出,且可以通過Java8的函數式編程解決該問題。

Java的web開發需要excel的導入導出工具,所以需要一定的工具類實現,如果是使用easypoi、Hutool導入導出excel,會非常的損耗內存,因此可以嘗試使用easyexcel解決大數據量的數據的導入導出,且可以通過Java8的函數式編程解決該問題。

使用easyexcel,雖然不太會出現OOM的問題,但是如果是大數據量的情況下也會有一定量的內存溢出的風險,所以我打算從以下幾個方面優化這個問題:

  • 使用Java8的函數式編程實現低代碼量的數據導入
  • 使用反射等特性實現單個接口導入任意excel
  • 使用線程池實現大數據量的excel導入
  • 通過泛型實現數據導出

maven導入

<!--EasyExcel相關依賴-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

使用泛型實現對象的單個Sheet導入

先實現一個類,用來指代導入的特定的對象

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("stu_info")
@ApiModel("學生信息")
//@ExcelIgnoreUnannotated 沒有注解的字段都不轉換
publicclass StuInfo {

    privatestaticfinallong serialVersionUID = 1L;

    /**
     * 姓名
     */
    // 設置字體,此處代表使用斜體
//    @ContentFontStyle(italic = BooleanEnum.TRUE)
    // 設置列寬度的注解,注解中只有一個參數value,value的單位是字符長度,最大可以設置255個字符
    @ColumnWidth(10)
    // @ExcelProperty 注解中有三個參數value,index,converter分別代表表名,列序號,數據轉換方式
    @ApiModelProperty("姓名")
    @ExcelProperty(value = "姓名",order = 0)
    @ExportHeader(value = "姓名",index = 1)
    private String name;

    /**
     * 年齡
     */
//    @ExcelIgnore不將該字段轉換成Excel
    @ExcelProperty(value = "年齡",order = 1)
    @ApiModelProperty("年齡")
    @ExportHeader(value = "年齡",index = 2)
    private Integer age;

    /**
     * 身高
     */
    //自定義格式-位數
//    @NumberFormat("#.##%")
    @ExcelProperty(value = "身高",order = 2)
    @ApiModelProperty("身高")
    @ExportHeader(value = "身高",index = 4)
    private Double tall;

    /**
     * 自我介紹
     */
    @ExcelProperty(value = "自我介紹",order = 3)
    @ApiModelProperty("自我介紹")
    @ExportHeader(value = "自我介紹",index = 3,ignore = true)
    private String selfIntroduce;

    /**
     * 圖片信息
     */
    @ExcelProperty(value = "圖片信息",order = 4)
    @ApiModelProperty("圖片信息")
    @ExportHeader(value = "圖片信息",ignore = true)
    private Blob picture;

    /**
     * 性別
     */
    @ExcelProperty(value = "性別",order = 5)
    @ApiModelProperty("性別")
    private Integer gender;

    /**
     * 入學時間
     */
    //自定義格式-時間格式
    @DateTimeFormat("yyyy-MM-dd HH:mm:ss:")
    @ExcelProperty(value = "入學時間",order = 6)
    @ApiModelProperty("入學時間")
    private String intake;

    /**
     * 出生日期
     */
    @ExcelProperty(value = "出生日期",order = 7)
    @ApiModelProperty("出生日期")
    private String birthday;


}

重寫ReadListener接口

@Slf4j
publicclass UploadDataListener<T> implements ReadListener<T> {

    /**
     * 每隔5條存儲數據庫,實際使用中可以100條,然后清理list ,方便內存回收
     */
    privatestaticfinalint BATCH_COUNT = 100;

    /**
     * 緩存的數據
     */
    private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    /**
     * Predicate用于過濾數據
     */
    private Predicate<T> predicate;

    /**
     * 調用持久層批量保存
     */
    private Consumer<Collection<T>> consumer;

    public UploadDataListener(Predicate<T> predicate, Consumer<Collection<T>> consumer) {
        this.predicate = predicate;
        this.consumer = consumer;
    }

    public UploadDataListener(Consumer<Collection<T>> consumer) {
        this.consumer = consumer;
    }

    /**
     * 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來
     *
     * @param demoDAO
     */

    /**
     * 這個每一條數據解析都會來調用
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(T data, AnalysisContext context) {

        if (predicate != null && !predicate.test(data)) {
            return;
        }
        cachedDataList.add(data);

        // 達到BATCH_COUNT了,需要去存儲一次數據庫,防止數據幾萬條數據在內存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            try {
                // 執行具體消費邏輯
                consumer.accept(cachedDataList);

            } catch (Exception e) {

                log.error("Failed to upload data!data={}", cachedDataList);
                thrownew BizException("導入失敗");
            }
            // 存儲完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    /**
     * 所有數據解析完成了 都會來調用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

        // 這里也要保存數據,確保最后遺留的數據也存儲到數據庫
        if (CollUtil.isNotEmpty(cachedDataList)) {

            try {
                // 執行具體消費邏輯
                consumer.accept(cachedDataList);
                log.info("所有數據解析完成!");
            } catch (Exception e) {

                log.error("Failed to upload data!data={}", cachedDataList);

                // 拋出自定義的提示信息
                if (e instanceof BizException) {
                    throw e;
                }

                thrownew BizException("導入失敗");
            }
        }
    }
}

Controller層的實現

@ApiOperation("只需要一個readListener,解決全部的問題")
@PostMapping("/update")
@ResponseBody
public R<String> aListener4AllExcel(MultipartFile file) throws IOException {
    try {
        EasyExcel.read(file.getInputStream(),
                StuInfo.class,
                new UploadDataListener<StuInfo>(
                        list -> {
                            // 校驗數據
                              ValidationUtils.validate(list);
                            // dao 保存···
                            //最好是手寫一個,不要使用mybatis-plus的一條條新增的邏輯
                            service.saveBatch(list);
                            log.info("從Excel導入數據一共 {} 行 ", list.size());
                        }))
          .sheet()
          .doRead();
    } catch (IOException e) {

        log.error("導入失敗", e);
        thrownew BizException("導入失敗");
    }
    return R.success("SUCCESS");
}

但是這種方式只能實現已存對象的功能實現,如果要新增一種數據的導入,那我們需要怎么做呢?關注公眾號:碼猿技術專欄,回復關鍵詞:1111 獲取阿里內部java性能調優手冊!

可以通過讀取成Map,根據順序導入到數據庫中。

通過實現單個Sheet中任意一種數據的導入

Controller層的實現

@ApiOperation("只需要一個readListener,解決全部的問題")
@PostMapping("/listenMapDara")
@ResponseBody
public R<String> listenMapDara(@ApiParam(value = "表編碼", required = true)
                               @NotBlank(message = "表編碼不能為空")
                               @RequestParam("tableCode") String tableCode,
                               @ApiParam(value = "上傳的文件", required = true)
                               @NotNull(message = "上傳文件不能為空") MultipartFile file) throws IOException {
    try {
        //根據tableCode獲取這張表的字段,可以作為insert與劇中的信息
        EasyExcel.read(file.getInputStream(),
                        new NonClazzOrientedListener(
                                list -> {
                                    // 校驗數據
//                                        ValidationUtils.validate(list);

                                    // dao 保存···
                                    log.info("從Excel導入數據一共 {} 行 ", list.size());
                                }))
                .sheet()
                .doRead();
    } catch (IOException e) {
        log.error("導入失敗", e);
        thrownew BizException("導入失敗");
    }
    return R.success("SUCCESS");
}

重寫ReadListener接口

@Slf4j
publicclass NonClazzOrientedListener implements ReadListener<Map<Integer, String>> {

    /**
     * 每隔5條存儲數據庫,實際使用中可以100條,然后清理list ,方便內存回收
     */
    privatestaticfinalint BATCH_COUNT = 100;

    private List<List<Object>> rowsList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    private List<Object> rowList = new ArrayList<>();
    /**
     * Predicate用于過濾數據
     */
    private Predicate<Map<Integer, String>> predicate;

    /**
     * 調用持久層批量保存
     */
    private Consumer<List> consumer;

    public NonClazzOrientedListener(Predicate<Map<Integer, String>> predicate, Consumer<List> consumer) {
        this.predicate = predicate;
        this.consumer = consumer;
    }

    public NonClazzOrientedListener(Consumer<List> consumer) {
        this.consumer = consumer;
    }

    /**
     * 添加deviceName標識
     */
    privateboolean flag = false;

    @Override
    public void invoke(Map<Integer, String> row, AnalysisContext analysisContext) {
        consumer.accept(rowsList);
        rowList.clear();
        row.forEach((k, v) -> {
            log.debug("key is {},value is {}", k, v);
            rowList.add(v == null ? "" : v);
        });
        rowsList.add(rowList);
        if (rowsList.size() > BATCH_COUNT) {
            log.debug("執行存儲程序");
            log.info("rowsList is {}", rowsList);
            rowsList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        consumer.accept(rowsList);
        if (CollUtil.isNotEmpty(rowsList)) {
            try {
                log.debug("執行最后的程序");
                log.info("rowsList is {}", rowsList);
            } catch (Exception e) {

                log.error("Failed to upload data!data={}", rowsList);

                // 拋出自定義的提示信息
                if (e instanceof BizException) {
                    throw e;
                }

                thrownew BizException("導入失敗");
            } finally {
                rowsList.clear();
            }
        }
    }

這種方式可以通過把表中的字段順序存儲起來,通過配置數據和字段的位置實現數據的新增,那么如果出現了導出數據模板/手寫excel的時候順序和導入的時候順序不一樣怎么辦?

可以通過讀取header進行實現,通過表頭讀取到的字段,和數據庫中表的字段進行比對,只取其中存在的數據進行排序添加

/**
 * 這里會一行行的返回頭
 *
 * @param headMap
 * @param context
 */
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
    //該方法必然會在讀取數據之前進行
    Map<Integer, String> columMap = ConverterUtils.convertToStringMap(headMap, context);
    //通過數據交互拿到這個表的表頭
//        Map<String,String> columnList=dao.xxxx();
    Map<String, String> columnList = new HashMap();
    columMap.forEach((key, value) -> {
        if (columnList.containsKey(value)) {
            filterList.add(key);
        }
    });
    //過濾到了只存在表里面的數據,順序就不用擔心了,可以直接把filterList的數據用于排序,可以根據mybatis做一個動態sql進行應用

    log.info("解析到一條頭數據:{}", JSON.toJSONString(columMap));
    // 如果想轉成成 Map<Integer,String>
    // 方案1: 不要implements ReadListener 而是 extends AnalysisEventListener
    // 方案2: 調用 ConverterUtils.convertToStringMap(headMap, context) 自動會轉換
}

那么這些問題都解決了,如果出現大數據量的情況,如果要極大的使用到cpu,該怎么做呢?

可以嘗試使用線程池進行實現

使用線程池進行多線程導入大量數據

Java中線程池的開發與使用與原理我可以單獨寫一篇文章進行講解,但是在這邊為了進行好的開發我先給出一套固定一點的方法。

由于ReadListener不能被注冊到IOC容器里面,所以需要在外面開啟。

詳情可見:https://juejin.cn/post/7251566038524133436

通過泛型實現對象類型的導出

public <T> void commonExport(String fileName, List<T> data, Class<T> clazz, HttpServletResponse response) throws IOException {
    if (CollectionUtil.isEmpty(data)) {
        data = new ArrayList<>();
    }
    //設置標題
    fileName = URLEncoder.encode(fileName, "UTF-8");
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
    EasyExcel.write(response.getOutputStream()).head(clazz).sheet("sheet1").doWrite(data);
}

直接使用該方法可以作為公共的數據的導出接口。

如果想要動態的下載任意一組數據怎么辦呢?可以使用這個方法。

public void exportFreely(String fileName, List<List<Object>> data, List<List<String>> head, HttpServletResponse response) throws IOException {
        if (CollectionUtil.isEmpty(data)) {
            data = new ArrayList<>();
        }
        //設置標題
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream()).head(head).sheet("sheet1").doWrite(data);
    }

什么?不僅想一個接口展示全部的數據與信息,還要增加篩選條件?這個后期可以單獨解決這個問題。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2025-02-17 07:48:45

2025-04-08 01:00:00

Spring開發系統

2022-06-06 08:42:04

spring-boo開發接口防盜刷

2011-05-06 14:19:29

ExcelSQL Server

2021-05-14 06:15:48

SpringAware接口

2022-08-01 07:02:06

SpringEasyExcel場景

2025-10-31 07:42:31

SpringExcel工具

2020-06-22 07:55:28

接口爬蟲

2020-11-13 07:08:51

Spring Boot應用Spring

2024-08-05 09:51:00

2023-07-18 17:59:38

2017-08-22 16:40:22

前端JavaScript接口

2025-03-03 10:30:00

JavaExcelSpringBoot

2024-11-11 11:30:34

2020-09-15 11:40:37

Spring Boot代碼Java

2023-10-18 15:25:29

數據源數據庫

2024-10-18 08:00:00

SpringBoot框架開發

2009-07-06 17:36:06

ResultSetJDBC Connec

2025-04-07 03:22:00

Excel服務器oss

2024-11-07 10:55:26

點贊
收藏

51CTO技術棧公眾號

夜夜春成人影院| av在线免费观看网| 亚洲精品欧洲| 亚洲无av在线中文字幕| 亚洲少妇久久久| 思思99re6国产在线播放| 国产麻豆成人精品| 欧美怡春院一区二区三区| 九九九视频在线观看| av一级久久| 欧美日韩国产中文精品字幕自在自线| 日本亚洲导航| 国产福利视频导航| 久久激情综合| 成人一区二区三区在线观看| 尤物99国产成人精品视频| 久久6免费视频| 中文在线免费二区三区| 亚洲少妇最新在线视频| 欧美不卡在线一区二区三区| 国产chinasex对白videos麻豆| 国产一区二区三区的电影 | 欧美3p视频在线观看| 青草国产精品久久久久久| 九九精品在线观看| 国产三级短视频| 琪琪久久久久日韩精品 | 免费a级片在线观看| 日本va欧美va瓶| 97精品久久久| 欧美黄色免费看| 水蜜桃久久夜色精品一区| 日韩电影大片中文字幕| 亚洲女则毛耸耸bbw| 成人国产精品入口免费视频| 亚洲午夜视频在线观看| 91免费视频黄| 日韩毛片久久久| 国产日韩欧美a| 欧美精品一区二区三区久久| 丰满熟女一区二区三区| 国产成人一区在线| 亚洲在线免费视频| 在线视频 中文字幕| 久久夜色精品| 国产99久久精品一区二区永久免费 | 亚洲精品成人在线| 夜夜爽www精品| 国产一区二区视频播放| 日本精品久久久久久| 国产在线日韩欧美| 国产精品老女人精品视频| 97久久久久久久| 日韩一级精品| 91福利视频网| 亚洲天堂视频网站| 亚洲美洲欧洲综合国产一区| 欧美精品九九久久| 日本免费在线播放| 亚洲激情精品| 欧美亚洲视频在线看网址| 欧美日韩精品区| 欧美亚洲在线| 欧美专区日韩视频| 日韩免费av网站| 久久一区二区三区超碰国产精品| 日本伊人精品一区二区三区介绍| 中文字幕高清在线免费播放| 久久高清国产| 国产精品伦子伦免费视频| 中文字幕在线观看国产| 麻豆免费精品视频| 91综合免费在线| 亚洲第一天堂在线观看| 成人综合婷婷国产精品久久 | 高h放荡受浪受bl| 成人99免费视频| 蜜桃传媒视频第一区入口在线看| 黄色毛片在线观看| 中文幕一区二区三区久久蜜桃| 亚洲国产欧洲综合997久久| 麻豆传媒视频在线| 亚洲一区在线观看网站| 人妻熟妇乱又伦精品视频| 欧美第一视频| 这里只有精品视频在线观看| 国内精品免费视频| 亚洲免费福利一区| 色播久久人人爽人人爽人人片视av| tube国产麻豆| 99亚洲伊人久久精品影院红桃| 国产乱子伦视频一区二区三区| 国产精品久久久久久久久男| 国产一区二区三区中文字幕| 成人一级片网址| 欧美日韩一区在线播放| 国产一二区在线| 天天综合色天天综合色h| 国产免费人做人爱午夜视频| 懂色av色香蕉一区二区蜜桃| 亚洲国产高清高潮精品美女| 免费在线观看a视频| 影音先锋日韩在线| 国产91对白在线播放| 国产又粗又黄又爽视频| 不卡一区二区中文字幕| 亚洲欧美国产不卡| 成人观看网址| 7777精品伊人久久久大香线蕉| 黄色a一级视频| 综合天堂av久久久久久久| 欧美一级淫片丝袜脚交| 国产福利第一页| 中文字幕不卡的av| 日韩在线综合网| 日韩午夜电影免费看| 亚洲精品国精品久久99热| 战狼4完整免费观看在线播放版| 亚洲青涩在线| 成人亚洲激情网| 国产精品免费播放| 亚洲国产视频网站| 中文字幕日韩久久| 精品欧美久久| 欧美一乱一性一交一视频| 亚洲av综合色区无码一二三区| 中文字幕免费不卡在线| 一女被多男玩喷潮视频| 日韩在线成人| 日韩一级裸体免费视频| 7799精品视频天天看| 99在线精品视频| 免费在线看黄色片| 久久的色偷偷| 日韩一区二区三区在线播放| 国产寡妇亲子伦一区二区三区四区| 成人激情校园春色| 日韩免费视频一区二区| 一级网站在线观看| 日韩国产欧美一区二区| 日本道色综合久久影院| 天堂在线视频免费| 一区二区三区日韩精品视频| 三区视频在线观看| 手机亚洲手机国产手机日韩| 国产精品美女网站| 国内精品在线视频| 欧美性69xxxx肥| 可以直接看的无码av| 亚洲区欧美区| 国产一区二区三区色淫影院| 欧美性爽视频| 日韩精品一区二区三区蜜臀| 欧美日韩一级在线观看| 国产一区二区三区在线观看免费视频 | 亚欧在线免费观看| 日日狠狠久久偷偷综合色| 国产91精品久久久久久久| 日韩在线视频第一页| 亚洲国产成人av网| 尤物网站在线观看| 亚洲欧洲视频| 欧美性bbwbbwbbwhd| 欧美xxxx做受欧美护士| 国产一区二区三区在线视频 | 日本不卡1234视频| 日韩国产欧美精品在线| 天堂а√在线中文在线新版 | 加勒比av在线播放| 成人免费视频一区| 欧美s码亚洲码精品m码| 国产99久久久国产精品成人免费| 国产精品88a∨| 在线免费观看黄色av| 欧美一区二区性放荡片| 久久久久性色av无码一区二区| 成人免费黄色在线| 亚洲自偷自拍熟女另类| 国模精品一区| 亚洲自拍偷拍区| 男人av在线播放| 午夜亚洲激情| 国产精品丝袜久久久久久高清| 国产精品刘玥久久一区| 精品成人在线观看| 亚洲自拍一区在线观看| 国产精品国产a级| 性色av浪潮av| 亚洲欧美日韩国产综合精品二区 | 国产日韩欧美在线| 午夜小视频福利在线观看| 亚洲国产精品大全| 黄色大全在线观看| 亚洲黄网站在线观看| 一二三不卡视频| 精品夜夜嗨av一区二区三区| 国产精品久久久久7777| 大色综合视频网站在线播放| 亚洲影院色在线观看免费| 在线最新版中文在线| www.国产一区| 日本福利在线观看| 51精品国自产在线| 看片网址国产福利av中文字幕| 中文字幕第一区综合| a级片在线观看视频| 久久精品国产精品亚洲精品 | 国产一区二区播放| 久久尤物电影视频在线观看| 深夜做爰性大片蜜桃| 免费在线亚洲| 六月婷婷激情综合| 欧美电影一区| 蜜桃在线一区二区三区精品| 激情五月综合婷婷| 国产精品国产三级国产aⅴ浪潮| 青草在线视频| 中文字幕久久亚洲| 欧美套图亚洲一区| 精品美女一区二区三区| 亚洲中文一区二区三区| 欧美视频在线免费| 欧美精品久久久久性色| 国产精品国产成人国产三级 | 亚洲欧美日韩电影| 成人小视频免费看| www国产成人| 国产av一区二区三区传媒| 激情综合色综合久久综合| 日本三区在线观看| 六月婷婷综合网| 亚洲国产电影在线观看| 国产偷人妻精品一区| 国产91精品久久久久久久网曝门| 九九九九九伊人| 免费一级欧美片在线观看| 免费黄色日本网站| 亚洲三级视频| www.av中文字幕| 韩国av一区| www.国产在线视频| 韩国久久久久| 欧美a级免费视频| 亚洲最新av| ijzzijzzij亚洲大全| 日韩免费一区| 亚洲国产一区二区三区在线| 国产日产精品_国产精品毛片| 狠狠色综合网站久久久久久久| 1313精品午夜理伦电影| 99影视tv| 精品中国亚洲| 精品一区二区三区自拍图片区| swag国产精品一区二区| 国产高清一区视频| y111111国产精品久久久| www.成人三级视频| 成人爽a毛片免费啪啪红桃视频| 亚洲aⅴ男人的天堂在线观看| 电影中文字幕一区二区| 成人av资源| 久久影视三级福利片| 好看的日韩精品| 亚洲精品aaaaa| 色中色综合成人| 97精品视频在线看| 正在播放精油久久| 欧美.日韩.国产.一区.二区| 日韩激情视频一区二区| 亚洲一区二区三区四区五区午夜| 狠狠爱免费视频| 免费看精品久久片| 91插插插影院| av一区二区三区在线| brazzers精品成人一区| 国产精品视频yy9299一区| tube国产麻豆| 婷婷丁香久久五月婷婷| 精品国产乱子伦| 67194成人在线观看| 亚洲女人18毛片水真多| 亚洲精品永久免费精品| 伊人免费在线| 欧美劲爆第一页| 成人福利av| 丁香五六月婷婷久久激情| 116极品美女午夜一级| 肉色丝袜一区二区| 97免费公开视频| 26uuu国产日韩综合| 91制片厂在线| 午夜国产精品影院在线观看| 国产精品免费无遮挡无码永久视频| 欧美疯狂性受xxxxx喷水图片| 精品国产av鲁一鲁一区| 亚洲精品色婷婷福利天堂| 亚洲视频tv| 午夜精品久久久久久久99热浪潮| 99久久er| 九色综合婷婷综合| 伊人久久大香线蕉精品组织观看| 日韩精品视频一区二区在线观看| 激情综合五月婷婷| 97超碰在线资源| 又紧又大又爽精品一区二区| 成年人晚上看的视频| 欧美xingq一区二区| 国产私拍精品| 午夜精品久久久久久99热| 欧美成人高清视频在线观看| 精品视频一区二区| 亚洲午夜精品一区 二区 三区| 少妇高清精品毛片在线视频| 国产成人免费在线观看| 成年人看的免费视频| 激情成人在线视频| 国产黄色大片网站| 中文字幕精品一区久久久久| 97成人资源| 国产精品一区二区三区四区五区| 天天综合网网欲色| 久久久久久久少妇| 97se亚洲国产综合在线| 欧美三级 欧美一级| 欧美男女性生活在线直播观看| 男操女在线观看| 5566日本婷婷色中文字幕97| 亚洲一区二区三区免费| 国产人妻互换一区二区| 免费观看在线色综合| 日韩av在线看免费观看| 午夜伦理一区二区| 精品久久国产视频| 久热国产精品视频| 久久天天久久| 亚洲高清视频在线观看| 久久资源在线| 色婷婷在线影院| 日韩欧美第一页| 色网站在线免费观看| 68精品久久久久久欧美| 极品国产人妖chinesets亚洲人妖| 久久视频免费在线| 激情五月激情综合网| 久久精品色妇熟妇丰满人妻| 欧美午夜电影网| 9色在线视频| 国产精品免费看久久久香蕉| 俺要去色综合狠狠| 日韩精品你懂的| 中文幕一区二区三区久久蜜桃| 在线观看免费视频a| 丝袜美腿亚洲一区二区| 日韩黄色三级在线观看| 一本一道久久久a久久久精品91| 看电视剧不卡顿的网站| av资源在线免费观看| 在线播放一区二区三区| av在线免费观看网址| 成人蜜桃视频| 亚洲黄色影片| 成都免费高清电影| 欧美亚洲动漫制服丝袜| 日本三级视频在线播放| 国产欧美精品一区二区三区-老狼| 久久国产小视频| 久久黄色一级视频| 亚洲国产成人tv| 青草久久伊人| 91精品美女在线| 欧美日韩福利| av网站免费在线播放| 欧美自拍偷拍一区| 成人ww免费完整版在线观看| www.久久久| 久久综合网络一区二区| 我不卡一区二区| 884aa四虎影成人精品一区| 国产三线在线| 欧美日韩国产不卡在线看| 久久97超碰国产精品超碰| 欧美被狂躁喷白浆精品| 日韩精品电影网| 国外成人福利视频| 国产一二三区在线播放| 2017欧美狠狠色| 中文字幕在线观看1| 久久久久久国产| 久久成人av| 自拍一级黄色片| 欧美日韩一区二区三区在线免费观看| 69av在线| 国产精品一国产精品最新章节| 视频一区在线视频| 黄色一级视频免费观看| 亚洲天堂视频在线观看| 日韩不卡在线视频| 熟妇人妻va精品中文字幕| 亚洲精品视频在线观看免费| 青草久久伊人|