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

還在用BeanUtils拷貝對象?MapStruct才是王者!

開發 前端
MapStruct 是一個代碼生成器,它基于約定優先于配置的方法大大簡化了 JavaBean 類型之間映射的實現。生成的映射代碼使用普通方法調用,因此速度快、類型安全且易于理解。

[[428964]]

本文轉載自微信公眾號「阿Q說代碼」,作者阿Q 。轉載本文請聯系阿Q說代碼眾號。

前幾天,遠在北京的小伙伴在群里拋出了“MapStruct”的概念。對于只聞其名,未見其人的我來說,決定對其研究一番。本文我們就從 MapStruct 的概念出發,通過具體的代碼示例來研究它的使用情況,最后與“市面上”的其它工具來做個對比!

官方介紹

首先我們打開 MapStruct 的官網地址,映入眼簾的就是下邊的三步曲:

What is it?

MapStruct 是一個代碼生成器,它基于約定優先于配置的方法大大簡化了 JavaBean 類型之間映射的實現。生成的映射代碼使用普通方法調用,因此速度快、類型安全且易于理解。

Why?

多層應用程序通常需要在不同的對象模型(例如實體和 DTO)之間進行映射。編寫這樣的映射代碼是一項乏味且容易出錯的任務。MapStruct 旨在通過盡可能自動化來簡化這項工作。

與其他映射框架不同,MapStruct 在編譯時生成 bean 映射,這確保了高性能,允許快速的開發人員反饋和徹底的錯誤檢查。

How?

MapStruct 是插入 Java 編譯器的注釋處理器,可以在命令行構建(Maven、Gradle等)中使用,也可以在首選 IDE 中使用。它使用合理的默認值,但在配置或實現特殊行為時,用戶可以自定義實現。

官網的解釋總是咬文嚼字,晦澀難懂的,看到這你只需要記住 MapStruct 是用來做實體類映射——實體類拷貝 的就可以了。

源碼地址:https://github.com/mapstruct/mapstruct

官網推薦的 Demo: https://github.com/mapstruct/mapstruct-examples

簡單實現

我們注意到官網中有涉及到簡單樣例的實現,我們用2分鐘來分析一波:

1. 引入依賴

  1. <dependency> 
  2.     <groupId>org.mapstruct</groupId> 
  3.     <artifactId>mapstruct-jdk8</artifactId> 
  4.     <version>1.3.0.Final</version> 
  5. </dependency> 
  6. //注解處理器,根據注解自動生成mapper的實現 
  7. <dependency> 
  8.     <groupId>org.mapstruct</groupId> 
  9.     <artifactId>mapstruct-processor</artifactId> 
  10.     <version>1.2.0.Final</version> 
  11. </dependency> 

我們在編譯時會報 java: No property named "numberOfSeats" exists in source parameter(s). Did you mean "null"? 錯誤,經過查閱資料發現 mapstruct-processor 和 Lombok 的版本需要統一一下:mapstruct-processor:1.2.0.Final , Lombok:1.16.14。

2. 準備實體類 Car.java 和 數據傳輸類 CarDto.java

  1. @NoArgsConstructor 
  2. @AllArgsConstructor 
  3. @Data 
  4. public class Car { 
  5.     private String make; 
  6.     private int numberOfSeats; 
  7.     private CarType type; 
  8.  
  9. @Data 
  10. @NoArgsConstructor 
  11. @AllArgsConstructor 
  12. public class CarDto { 
  13.     private String make; 
  14.     private int seatCount; 
  15.     private String type; 
  16.  

3. 創建映射器接口,里邊定義映射方法

  1. @Mapper 
  2. public interface CarMapper { 
  3.   
  4.     CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); 
  5.  
  6.     @Mapping(source = "numberOfSeats", target = "seatCount"
  7.     CarDto carToCarDto(Car car);  
  8.     

解析分析:

  • @Mapper 將接口標記為映射接口,并允許 MapStruct 處理器在編譯期間啟動。這里的 @Mapper 注解不是 mybatis 的注解,而是 org.mapstruct.Mapper 的;
  • 實際映射方法 carToCarDto() 期望源對象 Car 作為參數,并返回目標對象 CarDto ,方法名可以自由選擇;
  • 對于源對象和目標對象中具有不同名稱的屬性,可以使用 @Mapping 注釋來配置名稱;
  • 對于源對象和目標對象中具有不同類型的屬性,也可以使用 @Mapping 注釋來進行轉換,比如:類型屬性將從枚舉類型轉換為字符串;
  • 一個接口中可以有多個映射方法,對于所有的這些方法,MapStruct 將生成一個實現;
  • 該接口的實現實例可以從 Mappers 中獲得,接口聲明一個 INSTANCE,為客戶端提供對映射器實現的訪問。

4. 實現類

我們可以將代碼進行編譯,然后會發現在 target 文件中生成了 CarMapperImpl.class 文件:

從代碼中可以看出 MapStruct 為我們自動生成了 set/get 代碼,并且對枚舉類進行了特殊處理。

5. 客戶端

  1. @Test 
  2. public void shouldMapCarToDto() { 
  3.  
  4.     Car car = new Car( "Morris", 5, CarType.SEDAN ); 
  5.     CarDto carDto = CarMapper.INSTANCE.carToCarDto( car ); 
  6.     System.out.println(carDto); 
  7.      

執行結果:

小結: MapStruct 基于 mapper 接口,在編譯期動態生成 set/get 代碼的 class 文件 ,在運行時直接調用該 class 文件。

MapStruct 配置

@Mapper

我們翻開上邊提到的 Mapper 注釋的源碼,該注釋的解釋是:將接口或抽象類標記為映射器,并通過 MapStruct 激活該類型實現的生成。我們找到其中的 componentModel 屬性,默認值為 default,它有四種值供我們選擇:

  • default:映射器不使用組件模型,實例通常通過 Mappers.getMapper(java.lang.Class)獲取;
  • cdi:生成的映射器是 application-scoped 的CDI bean,可以通過 @Inject 獲取;
  • spring:生成的映射器是 Spring bean,可以通過 @Autowired 獲取;
  • jsr330:生成的映射器被 @javax.inject.Named 和 @Singleton 注釋,可以通過 @inject 獲取;

上邊我們用的就是默認的方法,當然我們也可以用 @Autowired 來引入接口依賴,此處不再舉例,有興趣的小伙伴可以自己試試!

另外我們可以看下 uses 屬性:可以通過定義其他類來完成字段轉換,接下來我們來個小例子演示一下:

1. 定義一個 CarVo.java 類

  1. @Data 
  2. @NoArgsConstructor 
  3. @AllArgsConstructor 
  4. public class CarVo { 
  5.  
  6.     private String make; 
  7.     private int seatCount; 
  8.     private boolean type; 

2. 在 mapper 中定義一個 vo 轉為 dto 的方法 CarDto carVoToCarDto(CarVo carVo);

當不加 uses 屬性時,查看編譯后生成的實現類

  1. public CarDto carVoToCarDto(CarVo carVo) { 
  2.  if (carVo == null) { 
  3.   return null
  4.  } else { 
  5.   CarDto carDto = new CarDto(); 
  6.   carDto.setMake(carVo.getMake()); 
  7.   carDto.setSeatCount(carVo.getSeatCount()); 
  8.   carDto.setType(String.valueOf(carVo.isType())); 
  9.   return carDto; 
  10.  } 

3.在 mapper 上增加 uses 屬性,并指定自定義的處理類,代碼如下: 

  1. @Mapper(uses = {BooleanStrFormat.class}) 
  2. public interface CarMapper { 
  3.     ...... 
  4.  
  5. /** 
  6. * 自定義的轉換類 
  7. */ 
  8. @Component 
  9. public class BooleanStrFormat { 
  10.     public String toStr(boolean type) { 
  11.         if(type){ 
  12.             return "Y"
  13.         }else
  14.             return "N"
  15.         } 
  16.     } 
  17.  
  18.     public boolean toBoolean(String type) { 
  19.         if (type.equals("Y")) { 
  20.             return true
  21.         } else { 
  22.             return false
  23.         } 
  24.     } 
  25.  
  26. /** 
  27. * 查看編譯后生成的實現類 
  28. */ 
  29. public CarDto carVoToCarDto(CarVo carVo) { 
  30.  if (carVo == null) { 
  31.   return null
  32.  } else { 
  33.   CarDto carDto = new CarDto(); 
  34.   carDto.setMake(carVo.getMake()); 
  35.   carDto.setSeatCount(carVo.getSeatCount()); 
  36.         //調用自定義的類中的方法 
  37.   carDto.setType(this.booleanStrFormat.toStr(carVo.isType())); 
  38.   return carDto; 
  39.  } 

4.客戶端代碼

  1. @Test 
  2. public void shouldMapCarVoToDto() { 
  3.  
  4.  CarVo carVo = new CarVo( "Morris", 5, false ); 
  5.  CarDto carDto = CarMapper.INSTANCE.carVoToCarDto( carVo ); 
  6.  
  7.  System.out.println(carDto); 

執行結果:

@Mapping

@Mapping 可以用來配置一個 bean 屬性或枚舉常量的映射,默認是將具有相同名稱的屬性進行映射,當然也可以用 source、expression 或者 constant 屬性手動指定,接下來我們來分析下常用的屬性值。

  • target:屬性的目標名稱,同一目標屬性不能映射多次。如果用于映射枚舉常量,則將給出常量成員的名稱,在這種情況下,源枚舉中的多個值可以映射到目標枚舉的相同值。
  • source:屬性的源名稱,
    • 如果帶注釋的方法有多個源參數,則屬性名稱必須使用參數名稱限定,例如“addressParam.city";
    • 當找不到匹配的屬性時,MapStruct 將查找匹配的參數名稱;
    • 當用于映射枚舉常量時,將給出常量成員的名稱;
  • 該屬性不能與 constant 或 expression 一起使用;
  • dateFormat:通過 SimpleDateFormat 實現 String 到 Date 日期之間相互轉換。
  • numberFormat:通過 DecimalFormat 實現 Number 與 String 的數值格式化。
  • constant:設置指定目標屬性的常量字符串,當指定的目標屬性的類型為:primitive 或 boxed(例如 Long)時,MapStruct 檢查是否可以將該 primitive 作為有效的文本分配給 primitive 或 boxed 類型。如果可能,MapStruct 將分配為文字;如果不可能,MapStruct 將嘗試應用用戶定義的映射方法。 另外,MapStruct 將常量作為字符串處理,將通過應用匹配方法、類型轉換方法或內置轉換來轉換該值。此屬性不能與 source、defaultValue、defaultExpression 或 expression 一起使用。
  • expression:是一個表達式,根據該表達式設置指定的目標屬性。他的屬性不能與 source、 defaultValue、defaultExpression、constant 一起使用。
  • ignore: 忽略這個字段。

我們用 expression 這個屬性來實現一下上邊用 uses 實現的案例:

1. 在 mapper 中定義方法

  1. @Mapping(target = "type", expression = "java(new com.ittest.controller.BooleanStrFormat().toStr(carVo.isType()))"
  2. CarDto carVoToDtoWithExpression(CarVo carVo); 

2. 生成的實現類

  1. @Override 
  2. public CarDto carVoToDtoWithExpression(CarVo carVo) { 
  3.  if ( carVo == null ) { 
  4.   return null
  5.  } 
  6.  
  7.  CarDto carDto = new CarDto(); 
  8.  
  9.  carDto.setMake( carVo.getMake() ); 
  10.  carDto.setSeatCount( carVo.getSeatCount() ); 
  11.  
  12.  carDto.setType( new com.ittest.controller.BooleanStrFormat().toStr(carVo.isType()) ); 
  13.  
  14.  return carDto; 

3. 客戶端

  1. @Test 
  2. public void mapCarVoToDtoWithExpression() { 
  3.  
  4.  CarVo carVo = new CarVo( "Morris", 5, false ); 
  5.  CarDto carDto = CarMapper.INSTANCE.carVoToDtoWithExpression( carVo ); 
  6.  
  7.  System.out.println(carDto); 

運行結果:

至于其他的用法大家可以多多探索。

重要提示:枚舉映射功能已被棄用,并被 ValueMapping 取代。它將在后續版本中刪除。

@Mappings

可以配置多個 @Mapping,例如

  1. @Mappings({ 
  2.     @Mapping(source = "id", target = "carId"), 
  3.     @Mapping(source = "name", target = "carName"), 
  4.     @Mapping(source = "color", target = "carColor"
  5. }) 

@MappingTarget

用于更新已有對象,還是用例子來說明吧:

1. 創建 BMWCar.java 類

  1. @NoArgsConstructor 
  2. @AllArgsConstructor 
  3. @Data 
  4. public class BMWCar { 
  5.     private String make; 
  6.     private int numberOfSeats; 
  7.     private CarType type; 
  8.  
  9.     private String color; 
  10.     private String price; 
  11.  

2. mapper 中創建更新方法,并查看實現類

  1. // 更新方法 
  2. void updateBwmCar(Car car, @MappingTarget BMWCar bwmCar); 
  3.  
  4. // 實現類 
  5. public void updateBwmCar(Car car, BMWCar bwmCar) { 
  6.  if (car != null) { 
  7.   bwmCar.setMake(car.getMake()); 
  8.   bwmCar.setNumberOfSeats(car.getNumberOfSeats()); 
  9.   bwmCar.setType(car.getType()); 
  10.  } 

3. 客戶端代碼

  1. @Test 
  2. public void updateBwmCar() { 
  3.  Car car = new Car( "Morris", 5, CarType.SEDAN ); 
  4.  BMWCar bwmCar = new BMWCar("BWM", 5, CarType.SPORTS, "RED""50w"); 
  5.  System.out.println("更新前 car:"+car.toString()); 
  6.  System.out.println("更新前 BWMCar:"+bwmCar.toString()); 
  7.  
  8.  CarMapper.INSTANCE.updateBwmCar(car, bwmCar); 
  9.  
  10.  System.out.println("更新后 car:"+car.toString()); 
  11.  System.out.println("更新后 BWMCar:"+bwmCar.toString()); 

執行結果:

擴展:多個對象映射一個對象

1. 準備實體類 Benz4SMall.java 和 Mall4S.java

  1. @NoArgsConstructor 
  2. @AllArgsConstructor 
  3. @Data 
  4. public class Mall4S { 
  5.  
  6.     private String address; 
  7.  
  8.     private String mobile; 
  9.  
  10.  
  11. @Data 
  12. @NoArgsConstructor 
  13. @AllArgsConstructor 
  14. public class Benz4SMall { 
  15.  
  16.     private String address; 
  17.     private String mobile; 
  18.     private String make; 
  19.     private int numberOfSeats; 

2. mapper 創建轉換方法并查看生成的實現類

  1. Benz4SMall mallCarToBenzMall(Car car, Mall4S mall4S); 
  2.  
  3. /** 
  4. * 實現類 
  5. */ 
  6. public Benz4SMall mallCarToBenzMall(Car car, Mall4S mall4S) { 
  7.  if (car == null && mall4S == null) { 
  8.   return null
  9.  } else { 
  10.   Benz4SMall benz4SMall = new Benz4SMall(); 
  11.   if (car != null) { 
  12.    benz4SMall.setMake(car.getMake()); 
  13.    benz4SMall.setNumberOfSeats(car.getNumberOfSeats()); 
  14.   } 
  15.  
  16.   if (mall4S != null) { 
  17.    benz4SMall.setAddress(mall4S.getAddress()); 
  18.    benz4SMall.setMobile(mall4S.getMobile()); 
  19.   } 
  20.  
  21.   return benz4SMall; 
  22.  } 

3. 客戶端

  1. @Test 
  2. public void mallCarToBenzMall() { 
  3.  Car car = new Car( "Morris", 5, CarType.SEDAN ); 
  4.  Mall4S mall4S = new Mall4S("北京市""135XXXX4503"); 
  5.  Benz4SMall benz4SMall = CarMapper.INSTANCE.mallCarToBenzMall(car, mall4S); 
  6.  System.out.println(benz4SMall.toString()); 

執行結果:

深拷貝與淺拷貝

深拷貝和淺拷貝最根本的區別在于是否真正獲取一個對象的復制實體,而不是引用。

假設 B 復制了 A ,修改 A 的時候,看 B 是否發生變化:如果 B 跟著也變了,說明是淺拷貝,拿人手短!(修改堆內存中的同一個值);如果 B 沒有改變,說明是深拷貝,自食其力!(修改堆內存中的不同的值)

MapStruct 中是創建新的對象,也就是深拷貝。

MapStruct 與其他 Copy 的對比

我們在平時的項目中經常會使用到拷貝的功能,今天我們就將他們做一下對比,直接拋出 ZhaoYingChao88 大佬的實驗結果:

輸出結果:手動Copy >Mapstuct>= cglibCopy > springBeanUtils > apachePropertyUtils > apacheBeanUtils 可以理解為: 手工復制 > cglib > 反射 > Dozer。

根據測試結果,我們可以得出在速度方面,MapStruct 是最好的,執行速度是 Apache BeanUtils 的10倍、Spring BeanUtils 的 4-5倍、和 BeanCopier 的速度差不多。 

總結:在大數據量級的情況下,MapStruct 和 BeanCopier 都有著較高的性能優勢,其中 MapStruct 尤為優秀。如果你僅是在日常處理少量的對象時,選取哪個其實變得并不重要,但數據量大時建議還是使用 MapStruct 或 BeanCopier 的方式,提高接口性能。

 

責任編輯:武曉燕 來源: 阿Q說代碼
相關推薦

2022-09-02 15:11:18

開發工具

2025-04-25 10:28:40

2020-08-10 14:30:09

BeanUtils工具類MapStruct

2020-08-10 10:40:03

工具類MapStructJava

2025-06-25 08:10:00

screentmux運維

2012-07-19 10:03:32

2025-10-28 01:45:00

setTimeouAPI日志

2024-06-12 10:13:58

BeanUtils深拷貝代碼

2023-05-15 12:33:47

JavaPython編程語言

2024-11-12 16:28:34

2021-04-16 10:27:45

流程管理OA魔方網表

2024-04-11 09:17:51

ArraysJava安全

2025-09-08 04:00:00

2024-06-03 00:00:06

高性能數據傳輸應用程序

2022-09-02 08:17:40

MapStruct代碼工具

2020-03-04 14:05:35

戴爾

2015-05-14 14:27:39

撥號上網

2020-08-03 09:40:39

Python編程語言Instagram

2021-01-03 17:14:16

ORMObjective S運行

2025-08-27 00:01:55

點贊
收藏

51CTO技術棧公眾號

蜜桃视频在线观看视频| 国产乡下妇女做爰| 95精品视频| 一区二区理论电影在线观看| 国产精品果冻传媒潘| 毛片在线免费视频| 欧美超碰在线| 精品少妇一区二区三区日产乱码 | 日本黄色三级网站| av资源中文在线天堂| 久久精品欧美一区二区三区麻豆| 国产在线日韩在线| 粉嫩aⅴ一区二区三区| 日韩av有码| 亚洲激情国产精品| 亚洲怡红院在线| 一区二区三区短视频| 亚洲精品中文字幕在线观看| 久久青青草综合| av中文在线观看| 日本怡春院一区二区| 欧美成人h版在线观看| 国产熟妇久久777777| 日韩视频在线直播| 欧美少妇一区二区| 欧美日韩一道本| 国产超级va在线视频| 久久奇米777| 痴汉一区二区三区| 亚洲天堂狠狠干| 欧美综合国产| 午夜精品视频在线| 精品自拍偷拍视频| 青青草91久久久久久久久| 日韩精品亚洲精品| 一区二区三区四区影院| 午夜不卡一区| 欧美亚洲国产一区二区三区va| 日韩欧美不卡在线| 羞羞网站在线看| 综合在线观看色| 亚洲国产激情一区二区三区| 你懂的在线看| 91免费看`日韩一区二区| 波多野结衣成人在线| 国产精品亚洲lv粉色| 日韩电影一区二区三区| 欧美最顶级的aⅴ艳星| 日韩精品视频播放| 国内精品嫩模av私拍在线观看| y97精品国产97久久久久久| a级在线免费观看| 免费观看不卡av| 精品视频久久久久久久| yy1111111| 久久a爱视频| 亚洲福利在线观看| 黄色av电影网站| 成人盗摄视频| 亚洲缚视频在线观看| 日韩女优在线视频| 成人在线视频中文字幕| 亚洲电影免费观看高清完整版在线| 特黄特色免费视频| 成人看片爽爽爽| 亚洲国产精品推荐| 黄色工厂在线观看| 国产成人av| 中文字幕国产亚洲2019| 国产在视频线精品视频| 98精品视频| 久久高清视频免费| 国产在线一区视频| 日韩视频在线一区二区三区| 欧美中文字幕第一页| 欧美超碰在线观看| 久久精品免费观看| 亚洲综合日韩在线| 蜜臀久久久久久999| 91视频国产资源| 日韩av一区二区三区在线观看| 搞黄视频免费在线观看| 国产精品高清亚洲| youjizz.com在线观看| 日韩激情电影| 欧美三级三级三级| 日本黄色www| 青青视频一区二区| 尤物tv国产一区| 卡通动漫亚洲综合| 亚洲精品社区| 国产精品久久久久久久电影 | 久久精品国产一区二区| 91在线视频导航| 神马久久久久久久久久| 久久精品视频在线免费观看| 中文字幕中文字幕在线中一区高清 | 久久综合国产精品台湾中文娱乐网| 久草视频中文在线| 日韩精品欧美成人高清一区二区| 亚洲va电影大全| 午夜视频www| 亚洲欧美中日韩| 日日摸日日碰夜夜爽av| 97精品资源在线观看| 亚洲国产精品资源| 日本美女黄色一级片| 亚洲美女啪啪| 成人免费激情视频| 青青青草网站免费视频在线观看| 亚洲欧洲无码一区二区三区| 男人操女人逼免费视频| 超碰国产精品一区二页| 亚洲精品在线不卡| 特级片在线观看| 欧美aⅴ一区二区三区视频| 俄罗斯精品一区二区| av大片在线观看| 欧美日韩国产精品一区二区三区四区 | 日韩和欧美一区二区三区| 91亚洲精品丁香在线观看| 国产系列电影在线播放网址| 香蕉成人伊视频在线观看| 9l视频白拍9色9l视频| 欧美亚洲色图校园春色| 久久99国产综合精品女同| 中文字幕日日夜夜| 久久午夜国产精品| 丰满少妇大力进入| 日韩三级不卡| 久久福利视频网| 一级黄色大片免费观看| 久久久久高清精品| 又粗又黑又大的吊av| 91在线一区| 欧美成人精品在线观看| 91在线视频国产| 中文字幕第一区二区| av视屏在线播放| 亚洲人成伊人成综合图片| 国模精品视频一区二区| 精品国产av 无码一区二区三区| 国产精品色婷婷久久58| 日本va中文字幕| 国产一区二区三区探花| 欧美诱惑福利视频| 天堂在线一二区| 欧美日韩国产中文字幕 | 亚洲精品aaaaa| 4438全国成人免费| 天天摸天天干天天操| 亚瑟在线精品视频| 在线看黄色的网站| 亚洲人成在线影院| 久久久久久久久一区二区| av最新在线| 日韩精品欧美国产精品忘忧草| xxxx.国产| 久久久蜜臀国产一区二区| 东京热加勒比无码少妇| 日韩手机在线| 国产精品极品美女在线观看免费 | 自拍亚洲一区| 国产成一区二区| 思思99re6国产在线播放| 欧美日韩国产高清一区二区三区| 亚洲一级二级片| 国产精品99久| 一二美女精品欧洲| 午夜婷婷在线观看| 国产欧美一区二区精品性| 日本老熟妇毛茸茸| 日韩欧美视频| 51国产成人精品午夜福中文下载 | 一区二区三区美女视频| 国产精九九网站漫画| 99伊人成综合| 色999日韩自偷自拍美女| 日韩大陆av| 欧美国产日产韩国视频| 丝袜视频国产在线播放| 欧美在线一二三| 侵犯稚嫩小箩莉h文系列小说| 国产69精品久久99不卡| 秋霞无码一区二区| 精品美女久久久| 999在线观看免费大全电视剧| av免费不卡国产观看| 亚洲欧美一区二区三区久久| 91无套直看片红桃| 亚洲国产成人tv| 中文字幕 自拍| 国产成人99久久亚洲综合精品| 国产成人精品视频免费看| 欧美日韩在线观看视频小说| 91亚色免费| 台湾成人免费视频| 欧美激情第99页| 风间由美一区| 亚洲国产成人爱av在线播放| 在线免费观看中文字幕| 午夜精品一区二区三区电影天堂| 中文字幕av久久爽一区| 国产成人免费视频网站| 九色porny91| 在线观看日韩av电影| 午夜精品一区二区在线观看| 国产96在线亚洲| 成人h片在线播放免费网站| 色在线视频观看| 久久久精品网站| 国模精品一区二区| 欧美不卡在线视频| 曰批又黄又爽免费视频| 欧美日韩亚洲精品内裤| 久久免费精彩视频| **性色生活片久久毛片| 91网站免费入口| av爱爱亚洲一区| 欧美一区二区三区影院| 另类的小说在线视频另类成人小视频在线 | 99精品福利视频| 最新不卡av| 成人av资源电影网站| 美女亚洲精品| 日韩大胆成人| 精品在线视频一区二区| av在线亚洲色图| 亚洲综合色av| 欧美电影院免费观看| 成人妇女免费播放久久久| 中文字幕系列一区| 国产精品9999| 日本在线中文字幕一区二区三区| 欧美最猛性xxxxx免费| 国产污视频在线播放| 国内精品模特av私拍在线观看| 色综合999| 色综合久久88色综合天天看泰| 成人无遮挡免费网站视频在线观看 | 亚洲一区二区三区黄色| 国产盗摄一区二区三区| 日日干日日操日日射| 久久国内精品视频| 免费看a级黄色片| 日韩电影一区二区三区四区| 欧美牲交a欧美牲交aⅴ免费真 | 中文字幕乱码人妻综合二区三区| 国模 一区 二区 三区| 只有这里有精品| 9191国语精品高清在线| 亚洲乱码一区二区三区| 蜜臀av免费一区二区三区| 日韩欧美精品一区二区三区经典| 青青一区二区| 久久99蜜桃综合影院免费观看| 特黄特色欧美大片| 国产日产精品一区二区三区四区| 视频亚洲一区二区| 国产伦精品一区二区三区四区免费 | 精品久久久久久中文字幕2017| 老**午夜毛片一区二区三区| 成年人视频网站免费观看| 一本久道久久久| 俄罗斯av网站| 日韩不卡在线观看日韩不卡视频| 国产精品欧美激情在线观看| 肉肉av福利一精品导航| 国产三级三级看三级| 蜜桃av一区二区| 99九九99九九九99九他书对| 国产sm精品调教视频网站| 熟妇女人妻丰满少妇中文字幕| 国产精品亚洲成人| 国产乱码一区二区三区四区| 国产成人亚洲综合a∨婷婷图片| 精产国品一二三区| 东方欧美亚洲色图在线| 右手影院亚洲欧美| 国产无遮挡一区二区三区毛片日本| 人人人妻人人澡人人爽欧美一区| 国产精品久久久久久久浪潮网站| 三级影片在线观看| 亚洲精品高清视频在线观看| 亚洲天堂日韩av| 色噜噜夜夜夜综合网| 伊人免费在线观看高清版| 日韩精品一区二区三区视频在线观看| 日本人妻丰满熟妇久久久久久| 亚洲国产精品免费| 国产九九在线| 理论片在线不卡免费观看| 在线中文字幕电影| 国产aaa精品| 日韩五码电影| 国产精品一区二区不卡视频| 欧美一区二区三区高清视频| 国产日韩第一页| 影音先锋亚洲一区| 午夜视频在线网站| 成人aa视频在线观看| 国产精久久一区二区三区| 亚洲伊人伊色伊影伊综合网| 香蕉污视频在线观看| 91精品国产综合久久精品app| 男女污视频在线观看| 日韩在线观看你懂的| 久久电影网站| 国产精品久久一区| 一区二区三区四区视频免费观看| 欧美激情一区二区三区在线视频| 欧美3p视频| 欧美少妇性生活视频| 久久精品国产一区二区| 午夜视频在线观看国产| 亚洲欧美一区二区三区国产精品| 二区视频在线观看| 欧美精品vⅰdeose4hd| 麻豆app在线观看| 久久久久久av| 成人性片免费| 欧美日韩一区二区视频在线观看| 亚洲色图国产| 国产乱子伦农村叉叉叉| 国产风韵犹存在线视精品| 精品一区二区三区蜜桃在线| 午夜久久久久久电影| av 一区二区三区| 亚洲午夜久久久影院| 成人香蕉视频| 国产精品区一区二区三在线播放 | 日韩高清av在线| 国内老司机av在线| 国产精品久久久久久久久免费 | 亚洲高清不卡一区| 亚洲少妇在线| 天天爽夜夜爽视频| 亚洲色图视频网| 这里只有精品国产| 日韩成人av在线播放| 99久久精品免费看国产小宝寻花| 成人激情视频网| 91精品一区国产高清在线gif| 欧在线一二三四区| 91亚洲精品一区二区乱码| 自拍偷拍欧美亚洲| 精品av久久707| 色网在线观看| 国产免费一区二区三区| 中文字幕亚洲综合久久五月天色无吗''| 麻豆三级在线观看| 久久久久久久久岛国免费| 91午夜视频在线观看| 亚洲国产日韩欧美综合久久| 亚洲无线看天堂av| 成人亲热视频网站| 欧美二区不卡| 国产男女无遮挡猛进猛出| 国产精品国产三级国产普通话蜜臀 | 天堂成人在线| 青草热久免费精品视频| 色婷婷综合久久久久久| 欧美一区二区视频在线播放| 国产成人鲁色资源国产91色综| 在线免费观看亚洲视频| 精品久久久久99| 黄色羞羞视频在线观看| 国产精品yjizz| 视频一区在线播放| 香蕉视频久久久| 欧美精品一二三四| 麻豆网站在线| 91超碰在线电影| 在线视频日韩| 国产精品扒开腿做爽爽| 欧美片网站yy| 在线三级电影| 国产视频在线观看一区| 久久国产日本精品| 日韩精品电影一区二区三区| 欧美日韩一区小说| 国产在线激情| 国产乱码精品一区二区三区卡| 国户精品久久久久久久久久久不卡| 乱码一区二区三区| 午夜精品久久久久久| 欧美日韩国产亚洲沙发| 成人羞羞国产免费| 韩日精品在线| 欧美午夜激情影院| 欧美一级久久久| 极品在线视频| 中文字幕一区二区三区最新| 国产成人午夜高潮毛片| 91久久国产综合久久91| 日韩中文字幕欧美| 青娱乐极品盛宴一区二区| 伊人成色综合网| 综合av第一页| 加勒比一区二区三区在线|