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

實體類的屬性映射怎么可以少了它?

開發 前端
我們都知道,隨著一個工程的越來越成熟,模塊劃分會越來越細,其中實體類一般存于 domain 之中,但 domain 工程最好不要被其他工程依賴,所以其他工程想獲取實體類數據時就需要在各自工程寫 model,自定義 model 可以根據自身業務需要映射相應的實體屬性。

 我們都知道,隨著一個工程的越來越成熟,模塊劃分會越來越細,其中實體類一般存于 domain 之中,但 domain 工程最好不要被其他工程依賴,所以其他工程想獲取實體類數據時就需要在各自工程寫 model,自定義 model 可以根據自身業務需要映射相應的實體屬性。這樣一來,這個映射工程貌似并不簡單了。阿粉差點就犯難了……

[[323180]]

所以阿粉今天就要給大家安利一款叫 mapstruct 的插件,它就是專門用來處理 domin 實體類與 model 類的屬性映射的,我們只需定義 mapper 接口,mapstruct 在編譯的時候就會自動的幫我們實現這個映射接口,避免了麻煩復雜的映射實現。

那可能有的小伙伴就要問了?為啥不用 BeanUtils 的 copyProperties 方法呢?不也照樣可以實現屬性的映射么?

這個啊,阿粉我開始也是好奇,所以就和 BeanUtils 深入交流了一番,最后才發現,BeanUtils 就是一個大老粗,只能同屬性映射,或者在屬性相同的情況下,允許被映射的對象屬性少;但當遇到被映射的屬性數據類型被修改或者被映射的字段名被修改,則會導致映射失敗。而 mapstruct 就是一個巧媳婦兒了,她心思細膩,把我們可能會遇到的情況都給考慮到了(要是阿粉我也能找一個這樣的媳婦兒該多好,內心笑出了豬聲)

 

如下是這個插件的開源項目地址和各種例子:

  • Github地址:https://github.com/mapstruct/mapstruct/
  • 使用例子:https://github.com/mapstruct/mapstruct-examples

一、準備工作

接下來,阿粉將和大家一起去解開這個巧媳婦兒的真正面紗,所以我們還需要做一點準備工作。

1.1、了解@Mapper 注解

從 mybatis3.4.0 開始加入的 @Mapper 注解,目的就是為了不再寫mapper映射文件。

我們只需要在 dao 層定義的接口上使用注解就可以實現sql語句的編寫,例如:

  1. @Select("select * from user where name = #{name}"
  2. public User find(String name); 

如上就是一個簡單的使用,雖然簡單,但也確實體現出了這個注解的優越性,至少少寫了一個xml文件。

但阿粉我今天可不是想跟你探討 @Mapper 注解,我主要是想去看我的巧媳婦兒 mapstruct ,所以我就只是想說下 @Mapper 注解的 componentModel 屬性,componentModel 屬性用于指定自動生成的接口實現類的組件類型,這個屬性支持四個值:

  • default: 這是默認的情況,mapstruct 不使用任何組件類型, 可以通過Mappers.getMapper(Class)方式獲取自動生成的實例對象。
  • cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
  • spring: 生成的實現類上面會自動添加一個@Component注解,可以通過Spring的 @Autowired方式進行注入
  • jsr330: 生成的實現類上會添加@javax.inject.Named 和@Singleton注解,可以通過 @Inject注解獲取

1.2、依賴包

首先需要把依賴包導入,主要由兩個包組成:

  • org.mapstruct:mapstruct:包含了一些必要的注解,例如@Mapping。r若我們使用的JDK版本高于1.8,當我們在pom里面導入依賴時候,建議使用坐標是:org.mapstruct:mapstruct-jdk8,這可以幫助我們利用一些Java8的新特性。
  • org.mapstruct:mapstruct-processor:注解處理器,根據注解自動生成mapper的實現。
  1. <dependency> 
  2.         <groupId>org.mapstruct</groupId> 
  3.         <!-- jdk8以下就使用mapstruct --> 
  4.         <artifactId>mapstruct-jdk8</artifactId> 
  5.         <version>1.2.0.Final</version> 
  6.     </dependency> 
  7.     <dependency> 
  8.         <groupId>org.mapstruct</groupId> 
  9.         <artifactId>mapstruct-processor</artifactId> 
  10.         <version>1.2.0.Final</version> 
  11.     </dependency> 

好了,準備工作做完了,接下來我們就看看巧媳婦兒巧在什么地方吧。

 

二、先簡單玩一把

2.1、定義實體類以及被映射類

  1. // 實體類 
  2. @Data 
  3. @NoArgsConstructor 
  4. @AllArgsConstructor 
  5. @Builder 
  6. public class User { 
  7.     private Integer id; 
  8.     private String name
  9.     private String createTime; 
  10.     private LocalDateTime updateTime; 
  11.  
  12. // 被映射類VO1:和實體類一模一樣 
  13. @Data 
  14. @NoArgsConstructor 
  15. @AllArgsConstructor 
  16. @Builder 
  17. public class UserVO1 { 
  18.     private Integer id; 
  19.     private String name
  20.     private String createTime; 
  21.     private LocalDateTime updateTime; 
  22.  
  23. // 被映射類VO1:比實體類少一個字段 
  24. @Data 
  25. @NoArgsConstructor 
  26. @AllArgsConstructor 
  27. @Builder 
  28. public class UserVO2 { 
  29.     private Integer id; 
  30.     private String name
  31.     private String createTime; 
  32.  

2.2、定義接口:

當實體類和被映射對象屬性相同或者被映射對象屬性值少幾個時:

  1. @Mapper(componentModel = "spring"
  2. public interface UserCovertBasic { 
  3.     UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class); 
  4.  
  5.     /** 
  6.      * 字段數量類型數量相同,利用工具BeanUtils也可以實現類似效果 
  7.      * @param source 
  8.      * @return 
  9.      */ 
  10.     UserVO1 toConvertVO1(User source); 
  11.     User fromConvertEntity1(UserVO1 userVO1); 
  12.  
  13.     /** 
  14.      * 字段數量類型相同,數量少:僅能讓多的轉換成少的,故沒有fromConvertEntity2 
  15.      * @param source 
  16.      * @return 
  17.      */ 
  18.     UserVO2 toConvertVO2(User source); 

從上面的代碼可以看出:接口中聲明了一個成員變量INSTANCE,母的是讓客戶端可以訪問 Mapper 接口的實現。

2.3、使用

  1. @RestController 
  2. public class TestController { 
  3.  
  4.     @GetMapping("convert"
  5.     public Object convertEntity() { 
  6.         User user = User.builder() 
  7.                 .id(1) 
  8.                 .name("張三"
  9.                 .createTime("2020-04-01 11:05:07"
  10.                 .updateTime(LocalDateTime.now()) 
  11.                 .build(); 
  12.         List<Object> objectList = new ArrayList<>(); 
  13.  
  14.         objectList.add(user); 
  15.  
  16.         // 使用mapstruct 
  17.         UserVO1 userVO1 = UserCovertBasic.INSTANCE.toConvertVO1(user); 
  18.         objectList.add("userVO1:" + UserCovertBasic.INSTANCE.toConvertVO1(user)); 
  19.         objectList.add("userVO1轉換回實體類user:" + UserCovertBasic.INSTANCE.fromConvertEntity1(userVO1)); 
  20.         // 輸出轉換結果 
  21.         objectList.add("userVO2:" + " | " + UserCovertBasic.INSTANCE.toConvertVO2(user)); 
  22.         // 使用BeanUtils 
  23.         UserVO2 userVO22 = new UserVO2(); 
  24.         BeanUtils.copyProperties(user, userVO22); 
  25.         objectList.add("userVO22:" + " | " + userVO22); 
  26.  
  27.         return objectList; 
  28.     } 

2.4、查看編譯結果

通過IDE的反編譯功能查看編譯后自動生成 UserCovertBasic 的實現類 UserCovertBasicImpl ,內容如下:

  1. @Component 
  2. public class UserCovertBasicImpl implements UserCovertBasic { 
  3.     public UserCovertBasicImpl() { 
  4.     } 
  5.  
  6.     public UserVO1 toConvertVO1(User source) { 
  7.         if (source == null) { 
  8.             return null
  9.         } else { 
  10.             UserVO1 userVO1 = new UserVO1(); 
  11.             userVO1.setId(source.getId()); 
  12.             userVO1.setName(source.getName()); 
  13.             userVO1.setCreateTime(source.getCreateTime()); 
  14.             userVO1.setUpdateTime(source.getUpdateTime()); 
  15.             return userVO1; 
  16.         } 
  17.     } 
  18.  
  19.     public User fromConvertEntity1(UserVO1 userVO1) { 
  20.         if (userVO1 == null) { 
  21.             return null
  22.         } else { 
  23.             User user = new User(); 
  24.             user.setId(userVO1.getId()); 
  25.             user.setName(userVO1.getName()); 
  26.             user.setCreateTime(userVO1.getCreateTime()); 
  27.             user.setUpdateTime(userVO1.getUpdateTime()); 
  28.             return user
  29.         } 
  30.     } 
  31.  
  32.     public UserVO2 toConvertVO2(User source) { 
  33.         if (source == null) { 
  34.             return null
  35.         } else { 
  36.             UserVO2 userVO2 = new UserVO2(); 
  37.             userVO2.setId(source.getId()); 
  38.             userVO2.setName(source.getName()); 
  39.             userVO2.setCreateTime(source.getCreateTime()); 
  40.             return userVO2; 
  41.         } 
  42.     } 

2.5、瀏覽器查看結果

 

好了,一個流程就走完了,是不是感覺賊簡單呢?

而且呀,阿粉溫馨提醒:如果是要轉換一個集合的話,只需要把這里的實體類換成集合就行了,例如:

  1. List<UserVO1> toConvertVOList(List<User> source); 

 

三、不簡單的情況

上面已經把整個流程都給過了一遍了,相信大家對 mapstruct 也有了一個基礎的了解了,所以接下來的情況我們就不展示全部代碼了,畢竟篇幅也有限,所以就直接上關鍵代碼(因為不關鍵的和上面內容一樣,哈哈)

3.1、類型不一致

實體類我們還是沿用 User;被映射對象 UserVO3 改為:

  1. @Data 
  2. @NoArgsConstructor 
  3. @AllArgsConstructor 
  4. @Builder 
  5. public class UserVO3 { 
  6.     private String id; 
  7.     private String name
  8.     // 實體類該屬性是String 
  9.     private LocalDateTime createTime; 
  10.     // 實體類該屬性是LocalDateTime 
  11.     private String updateTime; 

那么我們定義的接口就要稍稍修改一下了:

  1. @Mappings({ 
  2.             @Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"), 
  3.     }) 
  4.     UserVO3 toConvertVO3(User source); 
  5.  
  6.     User fromConvertEntity3(UserVO3 userVO3); 

上面 expression 指定的表達式內容如下:

  1. public class DateTransform { 
  2.     public static LocalDateTime strToDate(String str){ 
  3.         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss"); 
  4.         return LocalDateTime.parse("2018-01-12 17:07:05",df); 
  5.     } 
  6.  

通過IDE的反編譯功能查看編譯后的實現類,結果是這樣子的:

 

從圖中我們可以看到,編譯時使用了expression中定義的表達式對目標字段 createTime 進行了轉換;然后你還會發現 updateTime 字段也被自動從 LocalDateTime 類型轉換成了 String 類型。

阿粉小結:

當字段類型不一致時,以下的類型之間是 mapstruct 自動進行類型轉換的:

1、基本類型及其他們對應的包裝類型。此時 mapstruct 會自動進行拆裝箱。不需要人為的處理

2、基本類型的包裝類型和string類型之間

除此之外的類型轉換我們可以通過定義表達式來進行指定轉換。

3.2、字段名不一致

實體類我們還是沿用 User;被映射對象 UserVO4 改為:

  1. @Data 
  2. @NoArgsConstructor 
  3. @AllArgsConstructor 
  4. @Builder 
  5. public class UserVO4 { 
  6.     // 實體類該屬性名是id 
  7.     private String userId; 
  8.     // 實體類該屬性名是name 
  9.     private String userName; 
  10.     private String createTime; 
  11.     private String updateTime; 

那么我們定義的接口就要稍稍修改一下了:

  1. @Mappings({ 
  2.             @Mapping(source = "id", target = "userId"), 
  3.             @Mapping(source = "name", target = "userName"
  4.     }) 
  5.     UserVO4 toConvertVO(User source); 
  6.      
  7.     User fromConvertEntity(UserVO4 userVO4); 

通過IDE的反編譯功能查看編譯后的實現類,編譯后的結果是這樣子的:

 

阿粉小結:

當字段名不一致時,通過使用 @Mappings 注解指定對應關系,編譯后即可實現對應字段的賦值。

很明顯, mapstruct 通過讀取我們配置的字段名對應關系,幫我們把它們賦值在了相對應的位置上,可以說是相當優秀了,但這也僅僅是優秀,而更秀的還請繼續往下看:

 

3.3、屬性是枚舉類型

實體類我們還是改用 UserEnum:

  1. @Data 
  2. @NoArgsConstructor 
  3. @AllArgsConstructor 
  4. @Builder 
  5. public class UserEnum { 
  6.     private Integer id; 
  7.     private String name
  8.     private UserTypeEnum userTypeEnum; 

被映射對象 UserVO5 改為:

  1. @Data 
  2. @NoArgsConstructor 
  3. @AllArgsConstructor 
  4. @Builder 
  5. public class UserVO5 { 
  6.     private Integer id; 
  7.     private String name
  8.     private String type; 

枚舉對象是:

  1. @Getter 
  2. @AllArgsConstructor 
  3. public enum UserTypeEnum { 
  4.     Java("000""Java開發工程師"), 
  5.     DB("001""數據庫管理員"), 
  6.     LINUX("002""Linux運維員"); 
  7.      
  8.     private String value; 
  9.     private String title; 
  10.  

那么我們定義的接口還是照常定義,不會受到它是枚舉就有所變化:

  1. @Mapping(source = "userTypeEnum", target = "type"
  2.     UserVO5 toConvertVO5(UserEnum source); 
  3.  
  4.     UserEnum fromConvertEntity5(UserVO5 userVO5); 

通過IDE的反編譯功能查看編譯后的實現類,編譯后的結果是這樣子的:

 

很明顯, mapstruct 通過枚舉類型的內容,幫我們把枚舉類型轉換成字符串,并給type賦值,可謂是小心使得萬年船啊。

看來這巧媳婦兒不僅僅優秀還心細啊……

文章中的所有例子已上傳github:https://github.com/mmzsblog/mapstructDemo

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2009-09-10 10:09:46

LINQ to SQL

2024-05-16 08:28:20

類型處理器D3BootJSON

2011-06-01 15:45:28

實體類序列化

2023-01-04 08:53:52

JPA實體類注解

2023-01-12 09:13:49

Mybatis數據庫

2020-11-20 08:36:59

Jpa數據代碼

2022-04-18 09:54:37

JDK8日期前端

2024-10-21 07:15:08

2025-04-07 02:33:00

項目開發Spring

2021-06-28 07:09:24

MybatisresultMapJava

2017-07-20 17:05:04

JavaScriptswagger-decSwagger

2011-04-26 15:26:38

PostgreSQL

2011-04-26 14:21:50

MySQL

2009-09-09 13:07:37

創建Linq數據庫

2022-12-27 08:41:51

FastjsonJson字段

2009-09-18 15:22:14

DataContextLINQ to SQL

2013-09-08 22:12:02

EF Code Fir數據遷移MVC架構設計

2023-07-05 08:28:35

Core 模塊SqlSugar

2025-03-07 08:31:54

2009-12-30 15:06:22

ADO.NET分析
點贊
收藏

51CTO技術棧公眾號

欧美激情一区二区视频| 国产免费内射又粗又爽密桃视频| 亚洲综合网在线| aaa国产精品视频| 欧美性xxxx在线播放| 国产传媒一区二区| 国产精品久久久久久人| av中文字幕一区二区| 欧美一区二区三区人| 又粗又黑又大的吊av| 污视频在线免费| 日本aⅴ亚洲精品中文乱码| 美女性感视频久久久| 日韩中文字幕电影| 精品国产三级| 欧美在线免费观看亚洲| 性欧美.com| 影音先锋国产在线| 狠狠爱www人成狠狠爱综合网| 日韩欧美一级精品久久| 蜜臀久久99精品久久久酒店新书| 青青操在线视频| 奇米在线7777在线精品 | 日韩精品一区在线视频| 99国产精品欲| 日本中文一区二区三区| 色妞久久福利网| 我和岳m愉情xxxⅹ视频| 91久久精品无嫩草影院| 欧美蜜桃一区二区三区| 国产制服91一区二区三区制服| 丰满人妻妇伦又伦精品国产| 青青草伊人久久| 日韩av免费在线| 日韩av在线电影| 女同性一区二区三区人了人一| 日韩欧美精品在线视频| 午夜宅男在线视频| 色香欲www7777综合网| 黄色精品在线看| 免费看欧美黑人毛片| 大片免费在线看视频| 国产精品美日韩| 视频一区视频二区视频三区高| 国产免费的av| 亚洲日韩视频| 中文字幕国产精品久久| www.自拍偷拍| 久久久精品区| 高跟丝袜欧美一区| 三上悠亚久久精品| 大黄网站在线观看| 国产精品毛片无遮挡高清| 日本不卡一区| 成人av毛片| 国产精品久久久久影院亚瑟| 午夜午夜精品一区二区三区文| 亚洲AV无码精品国产| 日韩国产一区二| 国产精品igao视频| 日批视频免费观看| 亚洲黑丝一区二区| 97视频在线观看亚洲| 国产午夜视频在线| 亚洲无线视频| 操人视频在线观看欧美| 日韩一区二区三区四区在线| 午夜日韩电影| 97在线看福利| 久久久999久久久| 久久精品国产精品亚洲精品| 日本91av在线播放| 糖心vlog精品一区二区| 久久99久国产精品黄毛片色诱| 欧美一级淫片丝袜脚交| 麻豆视频在线观看| 日韩一级免费| 国产精品久久中文| 国产婷婷一区二区三区久久| 成人综合在线网站| 亚洲综合小说区| 性感美女一级片| 国产精品久久久久婷婷二区次| 日本一区二区三区视频在线观看 | 狠狠色狠狠色合久久伊人| 日韩免费在线观看视频| 中文字幕日日夜夜| 国产精品996| 快播亚洲色图| 日本中文字幕电影在线免费观看| 亚洲国产精品99久久久久久久久| 久久久久久九九| 天天干视频在线观看| 国产不卡免费视频| 青青草久久网络| 在线免费观看污| 色婷婷综合久久| 中文字幕无码毛片免费看| 同性恋视频一区| 久久国产精品久久久久久久久久| 小泽玛利亚一区二区免费| 国产精品99一区二区三| 性色av一区二区三区| 亚洲天堂999| 99久久精品免费精品国产| 翔田千里亚洲一二三区| 国产va在线视频| 88在线观看91蜜桃国自产| 欧美大尺度做爰床戏| jizz国产精品| 久久精品国产成人精品| 国产午夜精品久久久久| 国产成人三级在线观看| 亚洲毛片aa| 久久青青视频| 精品国产一区二区三区忘忧草| 国产精九九网站漫画| 成人短片线上看| 77777少妇光屁股久久一区| 天天干天天干天天操| 视频一区二区三区在线| 国产一区二区自拍| 免费在线看v| 亚洲午夜一二三区视频| 欧美激情第3页| 亚洲品质自拍| 91国产在线精品| 亚洲第九十九页| 亚洲乱码中文字幕| 亚洲福利精品视频| 精品中文字幕一区二区三区四区| 欧美精品一区男女天堂| 放荡的美妇在线播放| 蜜臀av亚洲一区中文字幕| 蜜桃久久精品乱码一区二区 | 久久视频国产精品免费视频在线| 青草草在线视频| 国产一区二区三区在线观看精品| 国产精品视频免费观看| 国产写真视频在线观看| 欧美日韩精品一区视频| av在线播放中文字幕| 日韩电影在线看| 日韩av电影免费在线观看| 少妇视频一区| 亚洲美女av网站| 天堂网免费视频| 国产午夜精品一区二区三区嫩草| 伊人久久大香线蕉成人综合网| 国产精品蜜臀| 精品欧美久久久| 国产真实乱人偷精品视频| 国产成+人+日韩+欧美+亚洲| 日韩欧美视频免费在线观看| 精品国产18久久久久久二百| 亚洲人成网在线播放| 麻豆精品久久久久久久99蜜桃| 国产一区二区福利| 亚洲天堂第一区| 亚洲一区二区三区中文字幕在线观看| 亚洲人成伊人成综合网久久久| 动漫性做爰视频| 国产福利精品导航| 欧美这里只有精品| 懂色av色香蕉一区二区蜜桃| 亚洲欧美激情精品一区二区| 91视频在线视频| 国产精品成人在线观看| 成人啪啪18免费游戏链接| 99精品国产99久久久久久福利| 91九色精品视频| 少女频道在线观看高清| 亚洲国产精品久久精品怡红院| 欧美爱爱免费视频| 国产成人午夜电影网| av之家在线观看| 欧美日一区二区| 亚洲在线观看视频| 草草视频在线| 自拍视频国产精品| 精品人妻一区二区三区三区四区| 亚洲国产成人在线| 免费黄色特级片| 91影院成人| 国产日韩二区| 欧美videos粗暴| 韩国v欧美v日本v亚洲| 国产视频二区在线观看| 日韩欧美在线观看| 777777国产7777777| 99在线视频精品| 成 人 黄 色 小说网站 s色| 欧美日韩中文| 亚洲国产午夜伦理片大全在线观看网站 | 国产午夜精品久久久久久免费视 | 妺妺窝人体色www聚色窝仙踪| 黄色精品一二区| 老太脱裤子让老头玩xxxxx| 第一会所亚洲原创| 国产一区二区免费电影| 国产福利亚洲| 精品国产一区二区三区久久| 蜜桃视频在线观看www| 欧美日韩久久久一区| 97久久久久久久| 一区二区三区免费在线观看| 亚洲午夜久久久久久久国产| 成人h版在线观看| 亚洲精品第三页| 日韩中文字幕不卡| 男女激情无遮挡| 欧美黄色aaaa| 国产精品视频500部| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 色综合亚洲精品激情狠狠| 天天干天天摸天天操| 欧美一区二区三区视频在线| 中文字幕+乱码+中文| 国产精品久久久久精k8| 一本色道综合久久欧美日韩精品 | 色婷婷一区二区三区| 精品午夜一区二区三区| 视频一区中文字幕精品| 久久久久久com| 国内外激情在线| 中文字幕在线观看亚洲| 国产精品一区在线看| 日韩精品极品毛片系列视频| 丁香六月色婷婷| 日韩一区二区三区视频在线| 91国在线视频| 欧美日韩精品一区二区三区四区| 精品少妇一二三区| 自拍偷拍国产亚洲| 中文字幕91视频| 国产精品久久久久婷婷二区次| 黄色在线免费播放| 国产不卡在线一区| 欧美图片自拍偷拍| 天堂一区二区在线免费观看| 欧洲黄色一级视频| a91a精品视频在线观看| 日韩小视频在线播放| 99国产精品99久久久久久粉嫩| 亚洲精品在线视频观看| 成人av资源电影网站| 相泽南亚洲一区二区在线播放 | 成人激情综合| 国产成人av在线播放| free欧美| 国产精品免费观看在线| 国产激情久久| 91精品在线国产| 日韩精品视频中文字幕| 国产ts人妖一区二区三区 | 久久成人18免费网站| 超碰在线网址| 欧美激情videos| 天堂а√在线最新版中文在线| 久久成年人视频| heyzo高清国产精品| 777777777亚洲妇女| 精品3atv在线视频| 国模视频一区二区三区| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 国产精品久久久久久久久久久新郎 | 日本人视频jizz页码69| 亚洲一区日韩| www.日本一区| 国产精品 欧美精品| 一边摸一边做爽的视频17国产| 国产一区美女在线| 中国特级黄色片| 久久男人中文字幕资源站| 影音先锋制服丝袜| 日韩毛片一二三区| 国产在线视频你懂的| 亚洲欧美偷拍三级| 日韩欧美亚洲视频| 亚洲韩国一区二区三区| 国产精品久久久久久久久久久久久久久久久| 亚洲欧美区自拍先锋| 国产又大又黑又粗免费视频| 欧美影视一区二区三区| 99久久精品日本一区二区免费| 欧美乱熟臀69xxxxxx| 国 产 黄 色 大 片| 国产亚洲视频在线观看| 欧美14一18处毛片| 国产999在线观看| 一区二区亚洲视频| 欧美精品亚洲精品| 亚洲宅男一区| 天堂av在线中文| 亚洲欧美网站| 成人性做爰aaa片免费看不忠| 老牛嫩草一区二区三区日本| 永久免费黄色片| 国产福利一区二区| 日批视频免费看| 中文字幕av不卡| 日韩网红少妇无码视频香港| 欧美色爱综合网| 在线视频你懂得| 亚洲精品美女在线观看| 日本在线视频1区| 国产亚洲欧美一区| 不卡在线视频| 91精品国产91久久久久久最新 | 国产精品美女在线观看| 国产成人高清精品免费5388| 伊人久久99| 亚洲一区区二区| 蜜臀aⅴ国产精品久久久国产老师| 成人小视频免费在线观看| 久久久国产一级片| 天天综合网 天天综合色| 国产乱码精品一区二区三区精东| 精品区一区二区| 巨大荫蒂视频欧美大片| 欧美丰满片xxx777| 国产精品视频一区二区三区| 日韩亚洲视频在线| 香蕉久久久久久久av网站| 视频免费在线观看| 亚洲综合在线五月| 99在线精品视频免费观看20| 色综合伊人色综合网| 精品123区| 日韩欧美一区二区三区四区五区| 99久久99热这里只有精品| 老司机激情视频| 国产酒店精品激情| 国产美女久久久久久| 精品国产乱码久久久久久天美| 一级一片免费看| 日韩一区二区在线观看视频播放| 亚洲欧美日韩免费| 2019中文字幕免费视频| 国产激情一区| 青青草影院在线观看| 激情国产一区二区 | 国产女18毛片多18精品| 中文字幕日韩在线视频| 高清欧美日韩| 中日韩在线视频| 久久久久国内| 色欲AV无码精品一区二区久久| 亚洲成a人v欧美综合天堂| 制服丝袜在线一区| 最近2019中文字幕mv免费看| 成人福利一区二区| 一区二区三区在线视频看| 九色|91porny| 久久中文免费视频| 精品久久一二三区| 国产精品xx| 欧美色欧美亚洲另类七区| 日本午夜一本久久久综合| 在线观看天堂av| 日韩三级在线免费观看| 国产偷倩在线播放| 成人午夜小视频| 成人情趣视频| 一二三av在线| 亚洲国产sm捆绑调教视频| 婷婷丁香一区二区三区| 国产成人精品视| 99久精品视频在线观看视频| 亚洲欧美激情一区二区三区| 午夜影视日本亚洲欧洲精品| 国产女人高潮毛片| 国外成人在线视频| 国产aⅴ精品一区二区三区久久| 男人添女荫道口喷水视频| 99精品国产视频| 最新国产中文字幕| 久久中文字幕在线| 国产精品sss在线观看av| 男人的天堂日韩| 亚洲自拍与偷拍| 加勒比一区二区三区在线| 98视频在线噜噜噜国产| 菠萝蜜一区二区| av在线天堂网| 欧美撒尿777hd撒尿| 国产精品69xx| 国产美女99p| 日本人妖一区二区| 欧美黄色免费在线观看| 亚洲欧美综合另类中字| 二区三区不卡| 欧洲金发美女大战黑人| 91女厕偷拍女厕偷拍高清| 国产精品久久久久久久免费看| 久久深夜福利免费观看| 亚洲人成精品久久久 | 色久欧美在线视频观看| aaa国产精品| 亚洲美女爱爱视频|