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

推薦一個(gè)對(duì)象轉(zhuǎn)換神器:MapStruct

開(kāi)發(fā) 開(kāi)發(fā)工具
MapStruct在編譯時(shí)生成具體的映射實(shí)現(xiàn)代碼,運(yùn)行時(shí)直接調(diào)用這些方法,避免了反射開(kāi)銷。而其他工具需要在運(yùn)行時(shí)通過(guò)反射動(dòng)態(tài)解析和執(zhí)行映射,性能自然差很多。

前言

今天我要給大家安利一個(gè)讓我相見(jiàn)恨晚的開(kāi)發(fā)神器——MapStruct。

相信不少小伙伴在工作中都寫(xiě)過(guò)這樣的"搬磚"代碼:

// 傳統(tǒng)的DTO轉(zhuǎn)換 - 又臭又長(zhǎng)的setter方法
UserDTO userDTO = new UserDTO();
userDTO.setId(userEntity.getId());
userDTO.setName(userEntity.getName());
userDTO.setEmail(userEntity.getEmail());
userDTO.setCreateTime(userEntity.getCreateTime());
userDTO.setUpdateTime(userEntity.getUpdateTime());
// ...還有十幾個(gè)字段要設(shè)置,寫(xiě)到手抽筋!

這種手動(dòng)轉(zhuǎn)換的方式不僅繁瑣易錯(cuò),而且維護(hù)起來(lái)特別痛苦。

今天我就帶大家徹底解決這個(gè)問(wèn)題!

一、為什么我們需要對(duì)象轉(zhuǎn)換工具?

1.1 現(xiàn)實(shí)開(kāi)發(fā)中的分層架構(gòu)

在現(xiàn)代應(yīng)用開(kāi)發(fā)中,我們通常采用分層架構(gòu),不同層使用不同的對(duì)象模型:

圖片圖片

每層之間的數(shù)據(jù)傳遞都需要進(jìn)行對(duì)象轉(zhuǎn)換,這就產(chǎn)生了大量的轉(zhuǎn)換代碼。

1.2 傳統(tǒng)轉(zhuǎn)換方式的三大痛點(diǎn)

1. 手動(dòng)setter方式(最原始但性能最好):

// 優(yōu)點(diǎn):性能好
// 缺點(diǎn):代碼冗長(zhǎng),容易出錯(cuò),難以維護(hù)
UserResponse response = new UserResponse();
response.setId(user.getId());
response.setUserName(user.getName());
response.setUserEmail(user.getEmail());
// ...省略無(wú)數(shù)行setter

2. Apache BeanUtils(使用反射,性能較差):

import org.apache.commons.beanutils.BeanUtils;

// 優(yōu)點(diǎn):代碼簡(jiǎn)潔
// 缺點(diǎn):性能差,類型轉(zhuǎn)換容易出錯(cuò)
UserDTO dto = new UserDTO();
try {
    BeanUtils.copyProperties(user, dto);
} catch (Exception e) {
    log.error("屬性拷貝失敗", e);
}

3. Spring BeanUtils(比Apache好點(diǎn),但仍有問(wèn)題):

import org.springframework.beans.BeanUtils;

// 優(yōu)點(diǎn):比Apache性能稍好
// 缺點(diǎn):仍然使用反射,復(fù)雜映射支持有限
UserDTO dto = new UserDTO();
BeanUtils.copyProperties(user, dto);

二、MapStruct:編譯生成的性能王者

2.1 什么是MapStruct?

MapStruct是一個(gè)基于注解處理器在編譯時(shí)生成映射代碼的工具。它與眾不同的地方在于:

  • 編譯時(shí)生成:在編譯期間生成具體的映射實(shí)現(xiàn)類,運(yùn)行時(shí)無(wú)反射開(kāi)銷
  • 類型安全:編譯期間檢查映射是否正確,提前發(fā)現(xiàn)錯(cuò)誤
  • 易于調(diào)試:生成的是普通Java代碼,可以輕松調(diào)試
  • 功能強(qiáng)大:支持復(fù)雜映射、自定義轉(zhuǎn)換、集合映射等

2.2 快速開(kāi)始:5分鐘上手MapStruct

1. 添加Maven依賴:

<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.3.Final</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.3.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

2. 創(chuàng)建實(shí)體類和DTO:

// 實(shí)體類
public class User {
    private Long id;
    private String username;
    private String email;
    private Date createTime;
    private Integer status;
    
    // getters and setters
}

// DTO類
public class UserDTO {
    private Long id;
    private String name;
    private String email;
    private String createTime;
    private String statusDesc;
    
    // getters and setters
}

3. 創(chuàng)建映射接口:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    
    @Mapping(source = "username", target = "name")
    @Mapping(source = "createTime", target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Mapping(target = "statusDesc", expression = "java(mapStatus(user.getStatus()))")
    UserDTO userToUserDTO(User user);
    
    default String mapStatus(Integer status) {
        if (status == null) {
            return"未知";
        }
        switch (status) {
            case1: return"激活";
            case2: return"禁用";
            default: return"未知";
        }
    }
}

4. 使用映射器:

// 編譯時(shí)MapStruct會(huì)自動(dòng)生成UserMapperImpl實(shí)現(xiàn)類
User user = userRepository.findById(1L);
UserDTO userDTO = UserMapper.INSTANCE.userToUserDTO(user);

三、MapStruct核心功能詳解

3.1 基本映射:字段名自動(dòng)匹配

當(dāng)字段名相同時(shí),MapStruct會(huì)自動(dòng)映射:

import org.mapstruct.Mapper;

@Mapper
public interface SimpleMapper {
    // 自動(dòng)映射相同字段名
    UserDTO userToUserDTO(User user);
    
    // 反向映射
    User userDTOToUser(UserDTO userDTO);
}

3.2 字段名不同的映射

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

@Mapper
public interface UserMapper {
    
    @Mappings({
        @Mapping(source = "username", target = "name"),
        @Mapping(source = "createTime", target = "registerTime")
    })
    UserDTO userToUserDTO(User user);
}

3.3 類型轉(zhuǎn)換和格式化

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.math.BigDecimal;
import java.text.DecimalFormat;

@Mapper
public interface ProductMapper {
    
    @Mapping(source = "price", target = "price", numberFormat = "$#.00")
    @Mapping(source = "weight", target = "weightText")
    ProductDTO productToProductDTO(Product product);
    
    default String mapWeight(BigDecimal weight) {
        if (weight == null) {
            return"0.0kg";
        }
        return weight.setScale(2, BigDecimal.ROUND_HALF_UP) + "kg";
    }
}

3.4 多對(duì)象聚合映射

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

@Mapper
public interface OrderMapper {
    
    @Mappings({
        @Mapping(source = "user.id", target = "userId"),
        @Mapping(source = "user.name", target = "userName"),
        @Mapping(source = "order.orderNo", target = "orderNumber"),
        @Mapping(source = "order.amount", target = "orderAmount"),
        @Mapping(source = "address.city", target = "city"),
        @Mapping(source = "address.detail", target = "addressDetail")
    })
    OrderDTO aggregateToDTO(User user, Order order, Address address);
}

四、高級(jí)特性:讓轉(zhuǎn)換更智能

4.1 集合映射

import org.mapstruct.Mapper;
import java.util.List;
import java.util.Set;

@Mapper
public interface CollectionMapper {
    
    // 列表映射
    List<UserDTO> usersToUserDTOs(List<User> users);
    
    // 集合映射
    Set<UserDTO> usersToUserDTOs(Set<User> users);
    
    // 自動(dòng)使用單個(gè)對(duì)象映射方法
    List<UserDTO> mapUserList(List<User> users);
}

4.2 嵌套對(duì)象映射

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

public class User {
    private Long id;
    private String name;
    private Department department; // 嵌套對(duì)象
}

public class Department {
    private Long id;
    private String name;
    private Company company; // 多層嵌套
}

public class UserDTO {
    private Long id;
    private String userName;
    private String departmentName;
    private String companyName;
}

@Mapper
public interface NestedMapper {
    
    @Mapping(source = "name", target = "userName")
    @Mapping(source = "department.name", target = "departmentName")
    @Mapping(source = "department.company.name", target = "companyName")
    UserDTO userToUserDTO(User user);
}

4.3 使用組件模型(Spring集成)

import org.mapstruct.Mapper;
import org.springframework.stereotype.Component;

@Mapper(componentModel = "spring") // 生成Spring組件
@Component
public interface UserMapper {
    
    UserDTO userToUserDTO(User user);
}

// 在Service中注入使用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    @Autowired
    private UserMapper userMapper; // 自動(dòng)注入
    
    public UserDTO getUserById(Long id) {
        User user = userRepository.findById(id);
        return userMapper.userToUserDTO(user);
    }
}

4.4 自定義映射方法

import org.mapstruct.Mapper;
import org.mapstruct.Named;
import java.util.Base64;

@Mapper
public interface CustomMapper {
    
    @Mapping(source = "password", target = "passwordHash", qualifiedByName = "hashPassword")
    UserDTO userToUserDTO(User user);
    
    @Named("hashPassword")
    default String hashPassword(String password) {
        if (password == null) {
            returnnull;
        }
        return Base64.getEncoder().encodeToString(password.getBytes());
    }
    
    // 多個(gè)自定義方法
    @Mapping(source = "rawData", target = "processedData", qualifiedByName = "processData")
    @Mapping(source = "timestamp", target = "formattedTime", qualifiedByName = "formatTime")
    DataDTO mapData(Data data);
    
    @Named("processData")
    default String processData(String rawData) {
        return"Processed: " + rawData;
    }
    
    @Named("formatTime")
    default String formatTime(Long timestamp) {
        return new java.util.Date(timestamp).toString();
    }
}

五、性能對(duì)比

5.1 性能測(cè)試對(duì)比

讓我們用真實(shí)數(shù)據(jù)對(duì)比各種對(duì)象轉(zhuǎn)換工具的性能:

import org.openjdk.jmh.annotations.*;
import org.springframework.beans.BeanUtils;
import org.apache.commons.beanutils.BeanUtils;
import org.modelmapper.ModelMapper;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
public class MappingBenchmark {
    
    private static final User user = createTestUser();
    private static final UserMapper mapStructMapper = Mappers.getMapper(UserMapper.class);
    private static final ModelMapper modelMapper = new ModelMapper();
    
    @Benchmark
    public void testManualMapping() {
        // 手動(dòng)setter方式
        UserDTO dto = new UserDTO();
        dto.setId(user.getId());
        dto.setName(user.getName());
        dto.setEmail(user.getEmail());
        // ...15個(gè)字段
    }
    
    @Benchmark
    public void testMapStruct() {
        mapStructMapper.userToUserDTO(user);
    }
    
    @Benchmark
    public void testSpringBeanUtils() {
        UserDTO dto = new UserDTO();
        BeanUtils.copyProperties(user, dto);
    }
    
    @Benchmark
    public void testApacheBeanUtils() {
        try {
            UserDTO dto = new UserDTO();
            BeanUtils.copyProperties(user, dto);
        } catch (Exception e) {
            // ignore
        }
    }
    
    @Benchmark
    public void testModelMapper() {
        UserDTO dto = modelMapper.map(user, UserDTO.class);
    }
}

性能測(cè)試結(jié)果(ops/s,越大越好):

轉(zhuǎn)換方式

平均性能

相對(duì)性能

內(nèi)存占用

手動(dòng)setter

1,200,000 ops/s

100%

MapStruct

1,150,000 ops/s

95.8%

Spring BeanUtils

350,000 ops/s

29.2%

Apache BeanUtils

50,000 ops/s

4.2%

ModelMapper

280,000 ops/s

23.3%

5.2 為什么MapStruct性能這么好?

圖片圖片

MapStruct在編譯時(shí)生成具體的映射實(shí)現(xiàn)代碼,運(yùn)行時(shí)直接調(diào)用這些方法,避免了反射開(kāi)銷。

而其他工具需要在運(yùn)行時(shí)通過(guò)反射動(dòng)態(tài)解析和執(zhí)行映射,性能自然差很多。

六、最佳實(shí)踐

6.1 全局配置和共享設(shè)置

import org.mapstruct.MapperConfig;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.Mapping;

@MapperConfig(
    componentModel = "spring",
    unmappedTargetPolicy = ReportingPolicy.ERROR, // 嚴(yán)格模式:未映射字段報(bào)錯(cuò)
    unmappedSourcePolicy = ReportingPolicy.WARN,  // 源字段未映射警告
    collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED
)
public interface CentralConfig {
    // 全局日期格式配置
    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Mapping(target = "updateTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    void configureTimestamps(Object source, Object target);
}

// 繼承全局配置
@Mapper(config = CentralConfig.class)
public interface UserMapper {
    // 具體映射方法
    UserDTO userToUserDTO(User user);
}

6.2 單元測(cè)試和調(diào)試

生成的代碼位置:

target/generated-sources/annotations/com/example/mapper/UserMapperImpl.java

單元測(cè)試示例:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class UserMapperTest {
    
    @Test
    public void testUserToUserDTOMapping() {
        // 準(zhǔn)備測(cè)試數(shù)據(jù)
        User user = new User();
        user.setId(1L);
        user.setUsername("蘇三");
        user.setEmail("susan@example.com");
        user.setCreateTime(new Date());
        user.setStatus(1);
        
        // 執(zhí)行轉(zhuǎn)換
        UserDTO dto = UserMapper.INSTANCE.userToUserDTO(user);
        
        // 驗(yàn)證結(jié)果
        assertNotNull(dto);
        assertEquals(user.getId(), dto.getId());
        assertEquals(user.getUsername(), dto.getName());
        assertEquals(user.getEmail(), dto.getEmail());
        assertNotNull(dto.getCreateTime());
        assertEquals("激活", dto.getStatusDesc());
    }
    
    @Test
    public void testNullSafeMapping() {
        // 測(cè)試空對(duì)象安全
        User user = null;
        UserDTO dto = UserMapper.INSTANCE.userToUserDTO(user);
        assertNull(dto);
    }
}

七、常見(jiàn)問(wèn)題解決方案

7.1 編譯問(wèn)題和配置

問(wèn)題:MapStruct注解處理器不工作解決方案:

<!-- 確保Maven配置正確 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>11</source>
                <target>11</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.3.Final</version>
                    </path>
                    <!-- 如果有Lombok,需要同時(shí)配置 -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.24</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

7.2 復(fù)雜映射場(chǎng)景處理

場(chǎng)景:需要根據(jù)條件動(dòng)態(tài)映射字段解決方案:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.condition.Condition;

@Mapper
public interface ConditionalMapper {
    
    @Mapping(target = "displayName", source = "username", 
             condition = "notBlank")
    @Mapping(target = "profileUrl", source = "id",
             condition = "positiveId")
    UserDTO userToUserDTO(User user);
    
    @Condition
    default boolean notBlank(String value) {
        return value != null && !value.trim().isEmpty();
    }
    
    @Condition
    default boolean positiveId(Long id) {
        return id != null && id > 0;
    }
}

總結(jié)

經(jīng)過(guò)全面的介紹和對(duì)比,我們來(lái)總結(jié)一下MapStruct的核心價(jià)值:

8.1 MapStruct的五大優(yōu)勢(shì)

  1. 性能卓越:編譯時(shí)生成代碼,無(wú)運(yùn)行時(shí)反射開(kāi)銷,性能接近手動(dòng)setter
  2. 類型安全:編譯時(shí)檢查映射正確性,提前發(fā)現(xiàn)錯(cuò)誤
  3. 功能豐富:支持復(fù)雜映射、自定義轉(zhuǎn)換、集合映射等高級(jí)特性
  4. 易于調(diào)試:生成的是普通Java代碼,可以輕松調(diào)試和優(yōu)化
  5. 集成簡(jiǎn)單:支持Spring、CDI等主流框架,無(wú)縫集成現(xiàn)有項(xiàng)目

8.2 適用場(chǎng)景

  • 分層架構(gòu)開(kāi)發(fā):DTO、VO、BO、Entity之間的轉(zhuǎn)換
  • API接口開(kāi)發(fā):請(qǐng)求/響應(yīng)對(duì)象的轉(zhuǎn)換和格式化
  • 微服務(wù)架構(gòu):服務(wù)間數(shù)據(jù)傳輸對(duì)象的轉(zhuǎn)換
  • 數(shù)據(jù)導(dǎo)出功能:領(lǐng)域?qū)ο蟮綄?dǎo)出數(shù)據(jù)的轉(zhuǎn)換
  • 老舊系統(tǒng)改造:替換原有的反射式轉(zhuǎn)換工具

8.3 不適用場(chǎng)景

  • 極度簡(jiǎn)單的映射:只有2-3個(gè)字段需要轉(zhuǎn)換
  • 動(dòng)態(tài)映射需求:運(yùn)行時(shí)才能確定映射規(guī)則的場(chǎng)景
  • 無(wú)編譯環(huán)境:無(wú)法使用注解處理器的特殊環(huán)境

好的工具不僅要解決當(dāng)前問(wèn)題,更要為未來(lái)的維護(hù)和擴(kuò)展考慮。

MapStruct不僅提升了開(kāi)發(fā)效率,更重要的是它讓代碼更加健壯、可維護(hù)和可測(cè)試。

責(zé)任編輯:武曉燕 來(lái)源: 蘇三說(shuō)技術(shù)
相關(guān)推薦

2022-09-02 08:17:40

MapStruct代碼工具

2025-08-27 08:24:23

2023-05-14 23:38:43

Glarity用戶視頻

2022-09-28 10:35:31

JavaScript代碼內(nèi)存泄漏

2022-05-27 09:02:31

Openbase開(kāi)源前端

2025-07-26 00:00:00

AI驅(qū)動(dòng)工具

2023-11-22 08:26:03

HutoolJava工具集

2018-08-15 15:23:48

視頻

2022-02-06 20:55:39

jsEsbuild項(xiàng)目

2024-04-07 00:00:01

TypeScript語(yǔ)言REST

2021-08-19 09:00:12

監(jiān)控文件Python

2019-02-25 10:18:43

工具代碼測(cè)試

2025-05-09 08:40:00

WAF開(kāi)源網(wǎng)站防護(hù)墻

2015-07-03 11:27:30

程序員自己神器

2025-01-09 06:00:00

Checkmate監(jiān)控系統(tǒng)開(kāi)源

2021-04-25 08:58:00

Go拍照云盤

2022-05-12 09:17:06

SQLPython

2025-03-07 08:31:54

2021-10-14 18:15:38

BeanUtils對(duì)象生成器

2023-08-28 08:19:05

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲福利在线观看视频| 国产亚洲成人av| 国产成人久久精品一区二区三区| 亚洲欧美aⅴ...| 国产精品美女黄网| 无码人妻一区二区三区免费| 不卡日本视频| 亚洲精品一区二区三区精华液| 妺妺窝人体色www在线小说| 国产亚洲依依| 丁香另类激情小说| 国产精品久久久久久久午夜| 免看一级a毛片一片成人不卡| 亚洲肉体裸体xxxx137| 91精品国产综合久久婷婷香蕉| 国产精品久久中文字幕| 秋霞成人影院| 久久综合色综合88| 96久久精品| a片在线免费观看| 最新国产拍偷乱拍精品 | 国产精品99久久久久久久久 | 日韩人在线观看| 色婷婷777777仙踪林| 成人好色电影| 91蜜桃视频在线| 成人情视频高清免费观看电影| 中文字字幕在线观看| 亚洲综合精品四区| 久久免费国产精品1| 成年人免费视频播放| 亚洲人成网亚洲欧洲无码| 日韩无一区二区| 日本一二区免费| 少妇精品视频一区二区免费看| 亚洲va中文字幕| 狠狠干视频网站| 麻豆视频免费在线观看| 中文字幕av一区 二区| 免费在线观看91| 四虎永久在线精品免费网址| 韩日欧美一区二区三区| 国产极品精品在线观看| 99超碰在线观看| 国产欧美一级| 欧美亚洲在线播放| 久久国产视频播放| av成人黄色| 欧美性视频精品| 亚洲免费激情视频| 一本久道久久综合婷婷鲸鱼| 久久久久中文字幕2018| 精品无码人妻一区二区三区| 中文无码久久精品| 欧美精品在线播放| 欧美丰满艳妇bbwbbw| 一区二区影视| 久久久人成影片一区二区三区观看| 99精品久久久久| 欧美特黄视频| 97在线观看免费| 青青操免费在线视频| 亚洲一区久久| 国产精品高清免费在线观看| 成人黄色三级视频| 久久精品72免费观看| 成人在线免费观看视视频| 国产又大又长又粗| 国产精品夜夜嗨| 国产伦理一区二区三区| 男同在线观看| 国产精品久久久久久久第一福利| 一区二区三区欧美在线| 美女国产在线| 亚洲一区在线视频| 午夜肉伦伦影院| 亚洲综合av一区二区三区| 欧美精品乱码久久久久久| 久久6免费视频| 麻豆一区二区麻豆免费观看| 亚洲精品视频久久| 国产大屁股喷水视频在线观看| 五月精品视频| 97在线观看免费高清| 一级久久久久久| 国产一区二区三区黄视频 | 亚洲午夜国产一区99re久久| 欧美色图色综合| jizzjizz少妇亚洲水多| 欧美一级片免费看| 一级少妇精品久久久久久久| 亚洲色图丝袜| 久久成人这里只有精品| 91国产丝袜播放在线| 久久精品99国产精品日本| 国产一区不卡在线观看| 91.xxx.高清在线| 一区二区高清在线| caopor在线视频| 视频免费一区二区| 国产一级揄自揄精品视频| 免费无遮挡无码永久在线观看视频| 亚洲综合激情| 99久久国产免费免费| 毛片免费在线观看| 亚洲一区二区在线观看视频 | 日韩在线视频线视频免费网站| 久久久久久欧美精品se一二三四| 男人的天堂亚洲在线| av一区观看| 日本高清视频在线播放| 狠狠躁夜夜躁人人躁婷婷91 | 99免费精品在线观看| 在线成人性视频| 女海盗2成人h版中文字幕| 91精品久久久久久蜜臀| 日本xxxxxxxxx18| 亚洲高清成人| 亚洲一区二区在线播放| 91xxx在线观看| 欧美日在线观看| 不许穿内裤随时挨c调教h苏绵| 成人高清av| 欧美性一区二区三区| 性做久久久久久久久久| 国产精品成人在线观看| 精品久久久久久无码国产| 久久草在线视频| 欧美激情乱人伦| 91丨porny丨在线中文 | 在线视频一二三区| 久久精品国产精品亚洲毛片| 亚洲欧美中文日韩在线| 日韩欧美一区二区一幕| 丁香亚洲综合激情啪啪综合| 大桥未久一区二区三区| 看片一区二区| 在线观看精品国产视频| 亚洲成熟少妇视频在线观看| 成人av网在线| 黄页网站大全在线观看| 99这里只有精品视频| 久久久久久91香蕉国产| www.亚洲黄色| 亚洲线精品一区二区三区八戒| 亚洲 自拍 另类 欧美 丝袜| 欧美理论在线播放| 国产精品视频中文字幕91| yiren22亚洲综合伊人22| 在线观看视频一区二区| 中文字幕有码在线播放| 美国十次了思思久久精品导航| 日本一区视频在线观看| 精品欧美日韩精品| 中文字幕欧美日韩| 96亚洲精品久久久蜜桃| 国产精品久久久久久久岛一牛影视 | 激情六月丁香婷婷| 免费av一区二区三区四区| 国产成人综合av| 国产精品999999| 国产二级一片内射视频播放| 很黄很黄激情成人| 国产精品xxxx| 黄色在线观看www| 日韩精品免费在线视频| 国产精品21p| 国产日本欧洲亚洲| 三年中文在线观看免费大全中国| 久久久五月天| 国产无套精品一区二区| 日韩性xxx| 最新国产成人av网站网址麻豆| 91在线公开视频| 亚洲黄色小说网站| 国产美女喷水视频| 麻豆91在线看| 国产亚洲黄色片| 国产精品嫩草影院在线看| 成人妇女淫片aaaa视频| 第四色日韩影片| 亚洲三级av在线| 国产精品毛片一区视频播| 亚洲午夜久久久久久久久久久| 免费a级黄色片| 九一九一国产精品| 国产日韩av网站| 成人看的羞羞网站| 不卡视频一区二区| 国产精品亚洲一区二区三区在线观看| www.欧美免费| 日本精品专区| 欧美一二区视频| 人妻丰满熟妇av无码区| 亚洲婷婷在线视频| 国产一级二级在线观看| 久久99精品一区二区三区三区| 国产一级做a爰片久久毛片男| 国产成人精品999在线观看| 99re视频在线| 国产一区影院| 欧美做爰性生交视频| 麻豆电影在线播放| 亚洲欧美另类在线观看| www.国产精品视频| 欧美午夜精品理论片a级按摩| 久久激情免费视频| 国产精品国产三级国产普通话99| 中文字幕一区二区人妻电影丶| 琪琪一区二区三区| 久久视频这里有精品| 国产精品久久观看| 日本亚洲自拍| 国产伦乱精品| 91精品啪在线观看麻豆免费| 中文日产幕无线码一区二区| 九九热精品视频国产| jyzzz在线观看视频| 国产视频综合在线| 好男人在线视频www| 欧美日韩国产欧美日美国产精品| 天堂中文在线网| 亚洲图片欧美视频| 免费网站观看www在线观| 成人免费在线播放视频| 丁香激情五月少妇| 久久久久久久网| 自拍视频一区二区| 成人一级黄色片| 国产精品熟女一区二区不卡| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美 日韩 国产 高清| 欧美精品色网| 中文字幕第50页| 国产精品99在线观看| 色一情一乱一伦一区二区三欧美| 最新亚洲精品| 欧美精品123| 在线看成人短视频| 欧美精品七区| 在线日韩网站| 日本一区精品| 日本不卡电影| 亚洲日本欧美在线| 99久久激情| 免费观看中文字幕| 亚洲成人三区| 国产91视频一区| 欧美日韩一区二区三区四区在线观看| 中国 免费 av| 欧美一区精品| 日韩成人三级视频| 99成人在线| 18禁男女爽爽爽午夜网站免费| 国产欧美三级| 亚洲不卡视频在线| 精品一区二区三区蜜桃| 国产乱叫456| 国产成人午夜99999| 逼特逼视频在线观看| www.66久久| wwwwww日本| 国产精品另类一区| 青娱乐国产精品| 午夜国产精品一区| 亚洲国产成人精品女人久久| 在线精品国精品国产尤物884a| 18国产免费视频| 日韩精品一区二区三区swag| 日本成人动漫在线观看| 亚洲欧洲激情在线| 午夜视频在线观看网站| 萌白酱国产一区二区| av成人影院在线| 国产国语videosex另类| 国产美女亚洲精品7777| 国产精品久久一区二区三区| 五月国产精品| 熟妇熟女乱妇乱女网站| 99xxxx成人网| 日韩中文字幕a| 粉嫩av一区二区三区| 草草影院第一页| 亚洲四区在线观看| 成年免费在线观看| 欧美日韩精品三区| 国产综合在线播放| 亚洲午夜小视频| 伊人春色在线观看| 国产成人精品一区| 中文字幕久久精品一区二区| 欧美一区二区视频17c | 99精品一区二区三区的区别| 国产精品v欧美精品v日本精品动漫| 乱妇乱女熟妇熟女网站| 国内精品免费**视频| 网站免费在线观看| 日韩一区在线看| 特级毛片www| 日韩一级片网站| 亚洲搞黄视频| 日本不卡视频在线播放| 午夜精品在线| 亚洲欧美国产精品桃花| av成人国产| 又黄又色的网站| 成人免费视频在线观看| 天天做天天爱夜夜爽| 日韩手机在线导航| 欧美极品另类| 国产成人精品免高潮费视频| 国产乱人伦精品一区| 色一情一乱一乱一区91| 蜜臂av日日欢夜夜爽一区| 在线播放第一页| 亚洲日本中文字幕区| 最近国语视频在线观看免费播放| 亚洲黄在线观看| 日韩av官网| 91亚洲国产精品| 91麻豆精品国产91久久久平台| 哪个网站能看毛片| heyzo一本久久综合| 精品亚洲永久免费| 欧美一区二区视频免费观看| porn视频在线观看| 日本精品久久久| 欧美深夜视频| 日韩avxxx| 99麻豆久久久国产精品免费优播| 国产真实的和子乱拍在线观看| 欧美丰满少妇xxxxx高潮对白| 成年人视频在线免费观看| 51精品国产黑色丝袜高跟鞋 | 国产一区二区在线免费观看| 国产精品www爽爽爽| 在线观看视频一区二区欧美日韩| 欧美女优在线观看| 欧美夜福利tv在线| 亚洲第一福利社区| 国产精品丝袜久久久久久消防器材| 成人av网站免费| 国产精品国产三级国产专区52| 亚洲国产精品热久久| 国产不卡人人| 久久综合中文色婷婷| 国产精品试看| 舐め犯し波多野结衣在线观看| 色婷婷精品大视频在线蜜桃视频 | 国产亚洲一区字幕| 欧美一区免费看| 国产一区二区三区直播精品电影| 成人亚洲免费| 日本黄色播放器| 国产成人亚洲综合色影视| 国产亚洲成人av| 亚洲精品国产精品乱码不99按摩 | 欧美99在线视频观看| 免费观看黄网站| 亚洲6080在线| 国产在线一二三区| 国产精品免费视频久久久| 天天色天天射综合网| 九色91porny| 精品久久久国产精品999| 韩国精品视频| 91久热免费在线视频| 亚洲欧洲一区| 亚洲天堂岛国片| 欧美一区日韩一区| 99在线视频影院| 日韩免费av电影| 国产精品自拍一区| 国产精品黄色大片| 色悠悠久久久久| 最新国产一区二区| 日韩在线xxx| 亚洲天堂2014| 神马久久精品| 成人日韩av在线| 夜夜夜久久久| 国产真实乱在线更新| 亚洲国产精品成人va在线观看| 电影亚洲精品噜噜在线观看 | 久久精品123| 熟女少妇a性色生活片毛片| 精品日韩成人av| 久久久成人av毛片免费观看| 成人手机在线播放| 久久久美女毛片| www.五月激情| 国产精品免费福利| 亚洲高清资源| www.4hu95.com四虎| 亚洲国产精品va| 亚洲毛片在线免费| aⅴ在线免费观看| 一区二区三区四区在线免费观看 | 久久午夜影院| 999这里有精品|