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

久久久久久久久久久成人| 中文字幕中文字幕在线中高清免费版 | 亚洲茄子视频| 亚洲国产精品精华液ab| 久久噜噜噜精品国产亚洲综合 | 九一九一国产精品| 亚洲色图第一页| 又粗又黑又大的吊av| 亚洲AV成人无码精电影在线| 亚洲一区站长工具| av一区二区三区四区| 九九久久久久99精品| 一区二区三区四区毛片| 91吃瓜网在线观看| 喷水一区二区三区| 国产亚洲欧美日韩一区二区| 能在线观看的av| 亚洲欧美自偷自拍| 99视频一区| 日韩福利视频在线观看| 男女激情无遮挡| 天堂av一区二区三区| 激情91久久| 亚洲成色777777在线观看影院| 精品视频在线观看一区二区| 亚洲狼人综合网| 亚洲电影av| 亚洲精品福利在线观看| 六月丁香婷婷激情| 超碰在线免费播放| 国产不卡视频一区| 久久久影视精品| 99re6热在线精品视频| 中文字幕综合| 亚洲男同1069视频| 国产成人精品免费视频大全最热 | 亚洲黄色av片| 国精产品一区一区三区四川| 国产日韩一级二级三级| 国产精品欧美一区二区| 亚洲AV成人无码精电影在线| 色综合综合网| 欧美日韩精品一区二区三区 | 成人动漫在线播放| 麻豆国产精品官网| 欧美成年人视频| 国产精品300页| 欧美日韩亚洲国产| 亚洲精品五月天| 最新欧美日韩亚洲| 日日躁夜夜躁白天躁晚上躁91| 国产乱码精品一区二区三区av| 久久频这里精品99香蕉| 免费在线观看日韩| 免费成人av| 亚洲欧美制服综合另类| 在线免费观看成年人视频| 91精品国产66| 亚洲在线观看免费| 青娱乐一区二区| 国产白浆在线观看| 亚洲欧美日韩国产一区二区| 最近2019中文免费高清视频观看www99 | 日韩av影片在线观看| 国产视频精品久久久| 色播五月综合| 国产夫妻自拍av| 国产成人av电影| 国产在线精品二区| 最近中文字幕在线视频| 欧美久久九九| 亚洲一级黄色片| 极品久久久久久久| 欧美18xxxx| 9191国产精品| 日本在线观看a| 2024最新电影在线免费观看| ●精品国产综合乱码久久久久 | 国产女无套免费视频| 极品尤物久久久av免费看| 久久99热这里只有精品国产| 久久久久久久久久久网 | 国产精品毛片无码| 国产精品毛片久久久久久| 亚洲一区二区三区在线视频 | av在线播放免费| 亚洲国产精品精华液ab| 天天综合五月天| 邻居大乳一区二区三区| 国产高清精品网站| 国产精品久久久久久亚洲调教 | 超碰在线公开| 中文字幕一区二区三区视频| 久久视频在线观看中文字幕| 99热这里只有精品1| 成人深夜福利app| 国产精品久久婷婷六月丁香| 国产又黄又爽视频| 日韩高清电影一区| 国产91精品久久久久久久| 精品99在线观看| 一区二区三区高清视频在线观看| 国产成人在线视频| 九九热精品视频在线| 亚洲视频高清| 日本三级久久久| 国产成人一区二区三区影院在线| 国产精品hd| 欧美整片在线观看| 成年人免费看毛片| 日韩影院精彩在线| 51国偷自产一区二区三区| 一级α片免费看刺激高潮视频| 久久一区视频| 欧美亚洲在线视频| 国产又大又黄的视频| 99精品久久只有精品| 狠狠干一区二区| 日本成人动漫在线观看| 丰满少妇久久久久久久| 日本一区二区三区四区在线观看| 中文av资源在线| 欧美中文字幕一区| 超碰在线97免费| 91久久久久久白丝白浆欲热蜜臀| 日韩精品一区二区在线| 不许穿内裤随时挨c调教h苏绵 | 在线亚洲伦理| 91久久久久久久| 国产乱淫片视频| 国产午夜精品一区二区三区视频 | 性爱视频在线播放| 亚洲蜜臀av乱码久久精品 | 久久精品国产**网站演员| 国产欧美一区二区在线播放| 麻豆网站视频在线观看| 亚洲手机成人高清视频| 日本一道在线观看| 99在线视频影院| 亚洲成人在线观看视频| 国产伦精品一区二区三区四区视频_ | 欧美艳星介绍134位艳星| 永久免费毛片在线播放不卡| 中文字幕黄色网址| 久久精品卡一| 国产免费一区二区三区在线能观看 | 成人在线视频免费播放| 麻豆一区一区三区四区| 亚洲精品一区久久久久久| 久久久91视频| 韩国精品久久久| 国产日本一区二区三区| 美足av综合网| 色婷婷综合中文久久一本| 国产精品一区二区小说| 日本免费精品| 精品亚洲一区二区三区四区五区| 精品无码黑人又粗又大又长| 国产成人日日夜夜| 999一区二区三区| 亚洲www免费| 91精品欧美一区二区三区综合在 | 黑森林av导航| 亚洲丝袜美腿一区| 色偷偷av亚洲男人的天堂| 波多野结衣一区二区在线| 国产精品综合一区二区三区| 国产精品美女在线播放| 成人黄色动漫| 日韩高清a**址| 中文字字幕在线中文| 久久一夜天堂av一区二区三区| 中文字幕日韩一区二区三区| 欧美jizz18| 亚洲欧美国产精品| 久久av高潮av无码av喷吹| 成人免费视频视频在线观看免费| 精品人妻人人做人人爽| 牛牛影视一区二区三区免费看| 51ⅴ精品国产91久久久久久| 成年人免费在线视频| 欧美日韩国产综合草草| 亚洲av鲁丝一区二区三区| 日韩精品乱码av一区二区| 亚洲v国产v在线观看| 日韩精品中文字幕吗一区二区| 国产69精品99久久久久久宅男| 青青草视频在线免费观看| 亚洲精品日韩专区silk| 小毛片在线观看| 日本亚洲视频在线| 久操手机在线视频| 国产精品嫩草影院在线看| 久久免费成人精品视频| 日本一级在线观看| 欧美久久久久中文字幕| 免费看黄色的视频| 亚洲永久视频| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲日本一区二区三区在线| 色99之美女主播在线视频| 国产xxxx在线观看| 色呦呦一区二区三区| 91传媒免费观看| 91玉足脚交白嫩脚丫在线播放| 一路向西2在线观看| 九九久久婷婷| 亚洲资源在线看| 欧美成人精品三级网站| 欧美日本黄视频| 91大神在线网站| 日韩精品视频在线免费观看| 国产精品爽爽久久久久久| 粉嫩老牛aⅴ一区二区三区| www.555国产精品免费| 欧美xxx在线观看| 97人人香蕉| 51一区二区三区| 69精品小视频| 男人的天堂在线| 日韩欧美激情一区| av首页在线观看| 狠狠久久亚洲欧美专区| 丝袜 亚洲 另类 欧美 重口| 国产一区二区免费看| 四虎4hu永久免费入口| 国产一区二区三区不卡视频网站| 官网99热精品| www.久久99| 国产日韩欧美在线视频观看| 看女生喷水的网站在线观看| 3751色影院一区二区三区| 日本黄色一级视频| 国产精品久久久一区麻豆最新章节| 中文字幕精品视频在线| 国产不卡在线播放| 男女视频在线观看网站| 精品69视频一区二区三区Q| 亚洲精品9999| 香蕉成人app| 91精品在线一区| 欧美一区二区三区婷婷| 欧美高清无遮挡| 天堂av资源在线| 欧美精品一区二区三区蜜桃| 国产精品21p| 天天操天天色综合| 欧美性受xxxx黑人| 国产日韩欧美电影| 少妇真人直播免费视频| 国产在线精品免费| 国产原创精品在线| 蜜桃视频一区二区| 国产美女在线一区| 欧美一区电影| 色女人综合av| 色777狠狠狠综合伊人| 国产不卡一区二区在线观看| 911精品国产| 国产精品中出一区二区三区| 日本.亚洲电影| 国产精品美女无圣光视频| 99热播精品免费| 国产精品网址在线| 国产高清日韩| 国产成人看片| 丝袜连裤袜欧美激情日韩| 成人av在线天堂| 日本а中文在线天堂| 久久国产精品电影| 婷婷av在线| 97视频免费看| av毛片在线播放| 欧美激情一级欧美精品| 国产不卡网站| 国产精品网址在线| 亚洲91网站| 久久久久国产精品视频| 欧美亚洲精品在线| 高清无码一区二区在线观看吞精| 在线日韩视频| 丰满少妇在线观看| 国产成人在线色| 国产男男chinese网站| 欧美激情一区不卡| 波多野结衣 在线| 国产精品美女视频| 免费三片在线播放| 欧美日韩午夜剧场| 一本色道久久综合无码人妻| 日韩欧美成人一区二区| 四虎在线观看| 亚洲国产日韩欧美在线图片 | 欧美区一区二区| 国产色视频一区| 日韩成人视屏| 欧美日韩亚洲在线| 老牛精品亚洲成av人片| 日本一区二区在线视频观看| 中文字幕一区二区三区欧美日韩| 亚洲欧美成人一区| 黄色欧美成人| 国内外成人免费在线视频| 成人做爰69片免费看网站| 色综合99久久久无码国产精品| 久久综合久久99| 小泽玛利亚一区二区免费| 国产精品日日摸夜夜摸av| 久久久久久免费观看| 欧美性感一区二区三区| 乱子伦一区二区三区| 日韩午夜电影av| 亚洲精品18p| 在线观看久久av| 麻豆mv在线观看| 2019国产精品视频| 欧美呦呦网站| www.亚洲视频.com| 99国产精品99久久久久久粉嫩| jizz欧美性11| 久久亚洲影视婷婷| 久久久久久久九九九九| 欧美日韩在线播放三区四区| 亚洲一级av毛片| 亚洲欧美日本精品| а√天堂8资源在线| 99re在线播放| 美女视频免费精品| 最新av网址在线观看| 久久国产婷婷国产香蕉| 韩国女同性做爰三级| 精品成人久久av| 国产77777| 亚洲人成在线播放| 国产传媒在线| 国产精品一区二区免费| 午夜久久99| 亚洲国产欧美91| 99r国产精品| 国产一级免费观看| 色综合久久中文字幕| 神马午夜一区二区| 欧美精品久久久久久久| 欧美区一区二区| 日本一级黄视频| 丁香六月久久综合狠狠色| 精品一区在线观看视频| 日韩一区二区三区视频在线| caopo在线| 97伦理在线四区| 欧美午夜不卡| 激情综合激情五月| 亚洲综合视频网| 秋霞av鲁丝片一区二区| 97视频com| 九九综合在线| www.99av.com| 国产精品女人毛片| 97超视频在线观看| 精品视频久久久久久久| 色在线中文字幕| 秋霞久久久久久一区二区| 日韩av一级片| 情侣偷拍对白清晰饥渴难耐| 91精品黄色片免费大全| 18videosex性欧美麻豆| 国产精品久久7| 国产精品一区亚洲| 亚洲一二三不卡| 亚洲精品v日韩精品| av手机天堂网| 日韩中文字幕在线看| 亚洲日本天堂| 91在线看网站| 亚洲欧洲日本一区二区三区| 精品无码在线视频| 色婷婷综合激情| 日韩子在线观看| 国产精品ⅴa在线观看h| 91亚洲成人| 毛葺葺老太做受视频| 成人三级伦理片| 亚洲国产成人无码av在线| 欧美电影免费观看完整版| 变态调教一区二区三区| 1区1区3区4区产品乱码芒果精品| 国模 一区 二区 三区| 波多野结衣 在线| 欧美疯狂性受xxxxx喷水图片| 二区三区在线观看| 鲁丝一区二区三区免费| 激情欧美一区二区三区| 精品无人区无码乱码毛片国产| 欧美精品成人一区二区三区四区| 日韩少妇视频| 日本一区二区三区精品视频| 国产白丝网站精品污在线入口 | 欧美精品在线一区二区| 超碰97免费在线| 一本一道久久a久久精品综合 |