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

无码人妻精品一区二区三区99不卡| 亚洲午夜高清视频| 在线观看免费国产视频| 女人av一区| 在线观看区一区二| 国产免费xxx| 天堂av在线资源| 久久精品国产久精国产爱| 欧美老女人性生活| 37p粉嫩大胆色噜噜噜| 在线观看欧美| 偷拍一区二区三区| 国产精品jizz在线观看老狼| 色丁香婷婷综合久久| 毛片不卡一区二区| 午夜免费在线观看精品视频| 五月婷婷六月香| 国产精品网站在线看| 欧美日韩一区二区三区四区| 国产一线二线三线女| jizz视频在线观看| 99精品久久只有精品| 成人精品久久久| 高清乱码免费看污| 国产精品v欧美精品v日本精品动漫| 亚洲日本欧美中文幕| fc2成人免费视频| 2020国产精品小视频| 色综合久久99| 国产高清av在线播放| 国产高清一区二区三区视频| 国产性天天综合网| 久久99久久99精品蜜柚传媒| 亚洲国产精品二区| 久久国产成人午夜av影院| 日本精品久久久久影院| 日韩精品一卡二卡| 狠狠色综合网| 欧美激情精品久久久久久黑人| 亚洲国产精品一区二区久久hs| 亚洲精品进入| 国产视频久久久久久久| 你懂的在线观看网站| 在线综合色站| 欧美高清视频一二三区 | 成人久久一区二区三区| 国产美女激情视频| 一本色道久久综合亚洲精品不卡 | 台湾佬中文娱乐网欧美电影| 亚洲一区在线观看免费 | 日韩成人精品在线观看| 欧美中文在线免费| 97久久久久久久| 国产农村妇女精品一二区| 欧美精品成人在线| 日韩欧美激情视频| 在线视频精品| 日韩美女免费视频| 成人黄色三级视频| 蜜桃一区二区三区在线观看| 国产精品一区二区电影| 在线观看日韩一区二区| 久久精品国产久精国产| 成人午夜在线观看| 国产三级视频在线播放| 国产成人午夜高潮毛片| 99精品99久久久久久宅男| 亚洲黄色小说网址| 不卡电影免费在线播放一区| 国产伦精品一区二区三区四区视频| 欧美在线精品一区二区三区| 成人黄色777网| 免费观看成人高| 国产香蕉视频在线看| 国产精品区一区二区三| 在线视频不卡国产| 牛牛在线精品视频| 五月天一区二区三区| 999香蕉视频| 欧美jizz18| 日韩视频在线一区二区| 国产精品无码电影| 国产九一精品| 欧美成人中文字幕| 成年人免费高清视频| 日韩av中文字幕一区二区三区 | 亚洲综合五月天婷婷丁香| 韩国精品免费视频| 国产一区二区三区无遮挡| 九一国产在线| 亚洲男人电影天堂| 农村妇女精品一二区| 久久亚洲人体| 亚洲精品美女久久久| 欧美波霸videosex极品| 中出一区二区| 日韩av片电影专区| 亚洲va天堂va欧美ⅴa在线| 91蜜桃网址入口| 在线日韩av永久免费观看| 爱搞国产精品| 欧美一区二区国产| 老牛影视av老牛影视av| 亚洲免费二区| 国产成人综合av| 亚洲精品无amm毛片| 国产丝袜欧美中文另类| 国产精彩视频一区二区| 国产精品久久久久久吹潮| 精品国产露脸精彩对白| 污污视频网站在线免费观看| 亚洲美女视频在线免费观看| 成人免费福利视频| 国产尤物视频在线| 亚洲成人av一区| 国产欧美一区二| 激情综合网五月| 97国产在线视频| 亚洲AV无码精品国产| 国产精品网曝门| av免费在线播放网站| 久久97久久97精品免视看秋霞| 麻豆一区二区在线观看| 最近中文字幕在线视频| 久久婷婷国产综合精品青草| 国产精品videossex国产高清| 欧美大片网站| 一个色综合导航| 日韩精品一区二区亚洲av| 大胆亚洲人体视频| 91成人在线视频观看| 国产成人a视频高清在线观看| 亚洲欧美成人网| 日韩av在线播放观看| 国产成人精品网址| 日韩国产精品毛片| 日韩欧国产精品一区综合无码| 亚洲天堂网在线观看| 久久国产视频一区| 97久久超碰国产精品电影| 国产乱淫av片杨贵妃| 欧美精品三级在线| 久久夜精品va视频免费观看| 国产一区二区三区成人| 国产精品家庭影院| 成人午夜激情av| 成人情趣视频网站| 国产精品一区二区三区毛片淫片| 免费一级在线观看| 色婷婷久久综合| 草草地址线路①屁屁影院成人| 亚洲久久成人| 国产一区二区三区高清视频| 国产中文在线播放| 精品亚洲精品福利线在观看| 成年人视频在线免费看| 久久精品亚洲精品国产欧美 | 成人亚洲一区二区一| 成人免费在线视频播放| 亚洲超碰在线观看| 欧美精品久久久久久久久| 黄色a在线观看| 天天做天天摸天天爽国产一区| aaaa黄色片| 亚洲在线免费| 视频一区亚洲| 精品国产不卡一区二区| 欧美日韩国产123| 少妇一区二区三区四区| 日韩欧美一区二区在线| 欧美激情 一区| 国产尤物一区二区| 中文字幕无码精品亚洲资源网久久| 动漫3d精品一区二区三区乱码| 57pao国产精品一区| 国产系列在线观看| 91精品国产91久久综合桃花| 久久精品国产亚洲AV无码麻豆| 99久久精品国产观看| 99久久激情视频| 婷婷亚洲最大| 国产视频一区二区不卡| 日本综合久久| 欧美激情一二三| 青青久在线视频| 欧美精三区欧美精三区| 久久精品久久国产| 国产欧美精品区一区二区三区| 亚洲欧美日本一区二区| 日韩亚洲在线| 亚洲区一区二区三区| 日本综合精品一区| 日韩av高清不卡| aaa大片在线观看| 亚洲欧美日韩天堂一区二区| 国产又爽又黄免费软件| 精品久久久久久中文字幕| 精品一区二区三孕妇视频| 国产福利一区二区三区视频| 久久久久久久久久久免费视频| 亚洲一区二区| 日本精品视频一区| 4438全国亚洲精品观看视频| 国产精品欧美亚洲777777| 国产精品偷拍| 日韩在线观看网址| 欧美日韩国产中文字幕在线| 日韩欧美三级在线| 中文字幕91爱爱| 欧美视频中文在线看| 99精品久久久久| 欧美国产成人精品| 国产网站无遮挡| 成人免费高清视频| 亚洲网中文字幕| 日韩精品电影在线观看| 精品无码国模私拍视频| 亚洲激情中文| 亚洲图片都市激情| 综合干狼人综合首页| 国产精品v欧美精品v日韩| 在线视频成人| 国产精品自产拍在线观看中文| 男人av在线播放| 久久久久久999| 国产精品va在线观看视色| 伊人伊成久久人综合网小说| 午夜福利理论片在线观看| 欧美刺激午夜性久久久久久久| 一道本在线视频| 欧美三级日韩三级| а中文在线天堂| 欧美视频在线看| 精品91久久久| 天天色综合天天| 午夜毛片在线观看| 亚洲成人动漫av| 国产精品a成v人在线播放| 亚洲精品福利视频网站| 麻豆视频在线免费看| 亚洲丝袜自拍清纯另类| 自拍偷拍第9页| 亚洲天堂2014| www.色小姐com| 亚洲午夜久久久| 久久久久成人精品无码| 一区二区三区免费在线观看| 欧美日韩免费做爰视频| 亚洲男女毛片无遮挡| 国产精品成人免费观看| 一区二区在线观看av| 久久久久人妻一区精品色欧美| 亚洲免费色视频| 欧美精品videos极品| 亚洲狠狠丁香婷婷综合久久久| 中文字幕另类日韩欧美亚洲嫩草| 亚洲欧美日韩国产中文在线| 五月天激情丁香| 亚洲综合图片区| 国产精品免费av一区二区| 色悠悠亚洲一区二区| 区一区二在线观看| 欧美日韩三级一区| 国产美女裸体无遮挡免费视频| 日韩一区二区中文字幕| 亚洲毛片在线播放| 精品视频www| 成人免费视频| 久久夜精品va视频免费观看| 成人影音在线| 日韩免费精品视频| 日本免费一区二区三区等视频| 亚洲一区二区中文| 精品一区二区男人吃奶| 日韩欧美在线电影| 一区二区三区午夜视频| 欧日韩免费视频| 日本不卡视频在线观看| 亚洲精品在线网址| www.66久久| 天天操天天舔天天射| 最新国产成人在线观看| 日本网站免费观看| 欧美在线短视频| 午夜精品小视频| 亚洲人成网站777色婷婷| 久热国产在线| 91产国在线观看动作片喷水| 成人国产激情在线| 国产精品成人一区二区三区| 精品日韩在线| 被灌满精子的波多野结衣| 久热综合在线亚洲精品| 少妇性l交大片7724com| 久久久另类综合| 婷婷色中文字幕| 色噜噜久久综合| 亚洲精品成人电影| 中文字幕亚洲综合久久| 成入视频在线观看| 91在线直播亚洲| 精品国产精品久久一区免费式| 男人j进女人j| 日本成人在线不卡视频| 国产激情第一页| 亚洲免费视频成人| 中文字幕1区2区3区| 日韩av中文字幕在线| a级网站在线播放| 国产精品免费福利| 噜噜噜狠狠夜夜躁精品仙踪林| 一区二区精品免费视频| 久久精品男女| 91人妻一区二区| 亚洲精品视频一区二区| 中文字幕一区二区三区四区欧美| 精品久久久网站| 黄色网页在线看| 国产精品夜色7777狼人| 国产一区不卡| 日本成年人网址| 成人精品一区二区三区四区 | 精品国产乱码久久久久久婷婷| 一级黄色大片免费| 亚洲性xxxx| 免费欧美电影| 欧美久久久久久一卡四| 亚洲大胆在线| 黄色激情在线观看| 亚洲激情男女视频| 99久久久国产精品无码免费| 深夜福利一区二区| 国产91在线播放精品| 日韩中文一区二区三区| 久热综合在线亚洲精品| 精品国产成人亚洲午夜福利| 欧美性猛交xxxx偷拍洗澡| 深夜福利免费在线观看| 91av在线不卡| 亚洲性视频大全| 狠狠爱免费视频| 国产午夜亚洲精品理论片色戒| 亚洲天堂一区在线观看| 亚洲毛片在线观看.| 国产日韩电影| 日本在线高清视频一区| 日本亚洲三级在线| 四虎国产成人精品免费一女五男| 欧美三级资源在线| 色综合久久影院| 91久久久亚洲精品| 亚洲字幕久久| 黄色性视频网站| 日韩欧美在线播放| 成人精品一区二区三区免费 | 久久久久久久国产| 国产精品任我爽爆在线播放| 免费国产a级片| 久久久电影一区二区三区| 中文天堂在线播放| 久久久成人精品| a看欧美黄色女同性恋| 国产一级爱c视频| 久久亚洲综合av| 岳乳丰满一区二区三区| 久久大大胆人体| 激情av综合| 亚洲免费av一区二区三区| 亚洲欧美在线aaa| 成人激情四射网| 2021国产精品视频| re久久精品视频| www.亚洲自拍| 欧美日韩国产黄| 97视频在线观看网站| 亚洲一区中文字幕| 99精品福利视频| 亚洲色图 激情小说| 日韩区在线观看| 国模冰冰炮一区二区| 国产精品av免费| 91免费看片在线观看| 97av免费视频| 51久久精品夜色国产麻豆| 日韩久久精品网| 国产人妻黑人一区二区三区| 欧美亚男人的天堂| 男人添女人下部高潮视频在线观看| 欧美一进一出视频| 国产一区二区三区黄视频 | 波多野结衣中文字幕一区 | 免费一级片视频| 亚洲一区www| 国产精品jk白丝蜜臀av小说| 爱情岛论坛成人| 亚洲在线成人精品| 尤物视频在线免费观看| 国产日韩欧美精品| 国产综合久久久久久久久久久久 | 91精品国产品国语在线不卡|