精品欧美一区二区三区在线观看 _久久久久国色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)

日韩中文字幕a| 国产精品日韩一区二区三区| 亚洲色成人网站www永久四虎| 亚洲欧美一区二区三区| 久久精品人人做人人爽人人| 日韩av片免费在线观看| 国产精品第七页| 欧美黑人疯狂性受xxxxx野外| 国产日韩精品一区二区三区| 91在线视频免费| 久草精品视频在线观看| 亚洲精品合集| 精品视频一区三区九区| 亚洲激情免费视频| 色久视频在线播放| 久久国产麻豆精品| 丝袜亚洲欧美日韩综合| 香蕉视频在线观看黄| 水蜜桃在线视频| 中文成人综合网| 国产在线精品一区免费香蕉| 国产性猛交普通话对白| 国产精品嫩草影院在线看| 欧美网站一区二区| 欧美性猛交内射兽交老熟妇| 你懂的在线免费观看| 极品少妇xxxx精品少妇| 久久久久久成人精品| 卡一卡二卡三在线观看| 亚洲一二av| 欧美视频一区二区三区四区| 国产3p露脸普通话对白| 国内精品在线视频| 成人黄色777网| 国产精品视频内| 日韩黄色精品视频| 五月精品视频| 亚洲第一av在线| 亚洲精品mv在线观看| 永久免费毛片在线播放| 亚洲欧洲99久久| 日产精品久久久一区二区| 国产精品熟女久久久久久| 国产手机视频一区二区| 欧美尺度大的性做爰视频| 阿v天堂2014| 国产精品对白久久久久粗| 欧美日韩精品三区| 情侣黄网站免费看| 26uuu亚洲电影在线观看| 欧美国产一区在线| 麻豆传媒一区| 性少妇videosexfreexxx片| 美女视频黄免费的久久| 国产成人aa精品一区在线播放| 少妇被躁爽到高潮无码文| 日韩国产一区二区| 亚洲色图18p| 久久久精品人妻无码专区| 欧美一级在线| 欧美午夜寂寞影院| 99久久国产宗和精品1上映| 波多野结衣中文在线| 亚洲欧美日韩综合aⅴ视频| 亚洲国产精品一区在线观看不卡 | 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 国产99久久精品一区二区永久免费 | 久久国产精彩视频| 久久高清内射无套| 成人一二三区| 久久精品男人天堂| 情侣偷拍对白清晰饥渴难耐| 第四色成人网| 色七七影院综合| 色综合99久久久无码国产精品| 色综合中文网| 北条麻妃一区二区三区中文字幕| 九九热视频在线免费观看| 欧美日韩99| 2019中文字幕在线| 久草热在线观看| 激情五月激情综合网| 91成人在线看| 亚洲人妻一区二区| 国产精品毛片大码女人| 免费国产成人看片在线| 欧美性受ⅹ╳╳╳黑人a性爽| 国产精品二三区| 美国av在线播放| 午夜伦理大片视频在线观看| 亚洲一区二区三区自拍| 九一国产精品视频| 午夜av成人| 欧美色窝79yyyycom| 日本xxxx免费| 日韩精品导航| 国产亚洲精品一区二区| 欧美性生交大片| 欧美日韩1区| 国产69久久精品成人| 天天爱天天做天天爽| 久久爱www久久做| 91亚洲精品丁香在线观看| 日本私人网站在线观看| 国产精品三级av| 久久福利一区二区| 另类激情视频| 欧美一级黄色录像| 久久久久亚洲av无码专区桃色| 校花撩起jk露出白色内裤国产精品| 一区二区亚洲欧洲国产日韩| 希岛爱理中文字幕| 美日韩一区二区三区| 亚洲a一级视频| 亚洲av毛片成人精品| 国产精品久久看| 每日在线观看av| 久久久久久久性潮| 亚洲国产欧美久久| 三级黄色片在线观看| 午夜亚洲福利| 国产精品成人av性教育| 国产浮力第一页| 久久精品网站免费观看| 女女百合国产免费网站| 成人在线高清| 精品少妇一区二区三区| 国产人妻一区二区| 亚洲视频福利| 国产日韩在线播放| 色视频在线观看免费| 亚洲欧美日韩电影| 簧片在线免费看| 亚洲精品不卡在线观看| 在线观看精品自拍私拍| 麻豆成人在线视频| 麻豆精品蜜桃视频网站| 久久波多野结衣| 三级福利片在线观看| 欧美日韩一区精品| 91视频免费观看网站| 亚洲精品欧美| 超碰97人人人人人蜜桃| 午夜视频成人| 在线中文字幕不卡| 久久久久久久无码| 欧美三区不卡| 51国偷自产一区二区三区的来源 | 国产91在线观看| 午夜视频久久久| 日本美女久久| 亚洲性线免费观看视频成熟| 天堂网一区二区三区| 懂色av中文字幕一区二区三区| 亚洲在线观看一区| 韩国精品视频在线观看| 亚洲国产精品久久久| 欧美xxxx精品| 日韩主播视频在线| 亚洲午夜精品久久久久久浪潮| 综合在线影院| 亚洲欧美在线第一页| 狠狠躁夜夜躁人人爽天天高潮| 东方欧美亚洲色图在线| 奇米777四色影视在线看| 日韩精品一级| 久久久噜噜噜久久久| 人人妻人人玩人人澡人人爽| 亚洲永久免费av| 日本少妇xxxx软件| 影音先锋久久精品| 国产精品视频在线免费观看 | 美女网站一区| 日韩av手机在线观看| 第三区美女视频在线| 精品视频一区三区九区| x88av在线| 久久97超碰国产精品超碰| 熟女视频一区二区三区| 91久久精品无嫩草影院| 97视频在线播放| 欧美日韩影视| 欧美三级电影一区| 99久久久免费精品| 国产成人av影院| 日韩中文字幕免费在线| 首页国产精品| 97碰碰视频| 中文字幕资源网在线观看免费| 亚洲性线免费观看视频成熟| 一级视频在线播放| 中文字幕第一区综合| 91精产国品一二三| 亚洲视频www| 神马影院午夜我不卡影院| 欧美成人一二区| 欧美激情中文网| 理论视频在线| 欧美日韩精品欧美日韩精品| 午夜69成人做爰视频| av在线一区二区三区| 999精品视频在线| 欧美不卡一区| 欧美精品123| 成人毛片免费| 5252色成人免费视频| 午夜免费视频在线国产| 亚洲电影av在线| 中文字幕二区三区| 亚洲国产乱码最新视频 | 久久精品超碰| 午夜精品久久17c| 日本三级在线播放完整版| 欧美一级精品在线| 一区二区三区在线免费观看视频| 亚洲精品一二三区| 女女互磨互喷水高潮les呻吟| 国产一区二区在线视频| 日本毛片在线免费观看| 一区二区三区四区电影| 亚洲午夜精品国产| 日韩三级视频| 国产传媒欧美日韩| 国产精品第一| 国产a∨精品一区二区三区不卡| 97超碰国产一区二区三区| 亚洲欧美另类国产| 性做久久久久久久| 欧美日韩视频一区二区| 国产一级一片免费播放| 中文字幕亚洲一区二区av在线| 性猛交╳xxx乱大交| 国产精品一区在线| 黄色三级视频在线| 久久久精品日韩| 免费人成在线观看视频播放| 不卡在线一区| 欧美久久久久久| 亚洲精品推荐| 国产精品美女xx| 久久久精品区| 国产日本欧美视频| 无人区在线高清完整免费版 一区二| 欧美高跟鞋交xxxxhd| 麻豆视频网站在线观看| 在线看日韩欧美| 精品无人乱码| 亚洲欧美在线第一页| 四虎精品在永久在线观看| 亚洲成人精品久久久| 一级黄色片免费看| 91精品在线免费观看| 亚洲综合精品视频| 欧美日韩免费观看一区二区三区 | 欧美在线不卡| 亚洲欧美99| 欧美精品乱码| 亚洲高清在线播放| 欧美精选一区二区三区| 免费在线国产精品| 蜜臀av免费一区二区三区| 色噜噜狠狠色综合网| 精品国精品国产自在久国产应用 | 中文字幕免费不卡| 精品人妻中文无码av在线| 国产日韩av一区| 免费黄在线观看| 久久久亚洲精品石原莉奈| 国产美女精品久久| 国产视频在线观看一区二区三区| 西西444www无码大胆| 欧美经典一区二区三区| 99国产精品免费| **性色生活片久久毛片| 欧美精品久久久久性色| 亚洲6080在线| 人人草在线观看| 欧美日韩aaaaa| 国产高清不卡视频| 亚洲乱码一区二区| 91亚洲精选| 超碰91人人草人人干| 免费毛片在线看片免费丝瓜视频| 高清一区二区三区四区五区 | 2019中文字幕全在线观看| 美女一区网站| 91色中文字幕| 粉嫩一区二区三区四区公司1| 99re资源| 成人自拍在线| 日本欧美色综合网站免费| 欧美xxxxx视频| 菠萝蜜视频在线观看入口| 国产日韩欧美一区在线| 国产熟人av一二三区| 久久99国产精品尤物| 国产精品手机在线观看| 久久久不卡影院| 午夜成人亚洲理伦片在线观看| 一区二区三区中文字幕| 波多野结衣不卡| 日韩免费视频一区| 欧美人体大胆444www| 爱福利视频一区| 性欧美xxx69hd高清| 97中文在线| 欧美日韩激情| 日本aa在线观看| 日韩精品午夜视频| 美女被爆操网站| 国产午夜精品一区二区| 欧美精品一区二区成人| 岛国av在线不卡| 国产成人av免费看| 一区二区三欧美| 超碰在线网站| 成人精品网站在线观看| 偷窥自拍亚洲色图精选| 久久在线中文字幕| 久久69国产一区二区蜜臀| 人妻无码一区二区三区| 亚洲精品国产高清久久伦理二区| 日韩精品一区二区三| 日韩视频在线永久播放| 国产高清av在线| 91国内在线视频| 国产一区二区三区黄网站| 欧美区高清在线| 午夜亚洲精品| www.四虎精品| 亚洲精品视频在线| 中文字幕视频在线播放| 国产一区二区三区在线| 国产资源在线观看入口av| 91香蕉视频在线下载| 久久一本综合| 91猫先生在线| 久久久国产午夜精品| 日韩女同强女同hd| 欧美电影免费提供在线观看| 尤物在线视频| 国产专区精品视频| 日韩国产一区| 小泽玛利亚视频在线观看| 久久人人超碰精品| 免费在线看黄网址| 精品精品国产高清一毛片一天堂| 九色porny丨首页在线| 国产精品视频网站| 激情婷婷综合| 五月婷婷之综合激情| 久久久久久久久久久99999| 成年人免费高清视频| 亚洲国产精品久久久久久| 伊人手机在线| 国产91一区二区三区| 欧美欧美天天天天操| 一级黄色免费毛片| 亚洲女与黑人做爰| 高清一区二区三区四区| 久久久久久久网站| 国内精品免费| 成年人视频观看| 本田岬高潮一区二区三区| 久久国产在线视频| 欧美精品一区二区三区蜜桃| eeuss鲁一区二区三区| 91在线视频一区| 亚洲激情精品| 国产精品无码网站| 色综合av在线| 中国日本在线视频中文字幕| 97免费资源站| 日韩午夜免费视频| 精品无码一区二区三区| 欧美唯美清纯偷拍| 电影k8一区二区三区久久| 精品日韩美女| 日韩精品一区第一页| 国产小视频你懂的| 亚洲国产欧美一区| av在线日韩| 国产成人生活片| 国产成人精品影院| 9i精品福利一区二区三区| 最好看的2019年中文视频| 午夜免费欧美电影| 每日在线更新av| 国产精品福利av| 色呦呦中文字幕| 国产精品视频在线播放| 女主播福利一区| 国产熟妇久久777777| 欧美二区三区91| 国产美女高潮在线观看| 欧美日韩电影一区二区| 国产福利精品一区二区| 天堂中文字幕在线观看| 日韩中文字幕免费| 中文一区二区三区四区|