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

一文搞懂如何在Spring Boot中正確使用JPA

開發 架構
本文已經整理進 JavaGuide 開源的 springboot-guide(SpringBoot 核心知識點總結。 基于 Spring Boot 2.19+),地址:https://github.com/Snailclimb/springboot-guide 。

JPA 這部分內容上手很容易,但是涉及到的東西還是挺多的,網上大部分關于 JPA 的資料都不是特別齊全,大部分用的版本也是比較落后的。另外,我下面講到了的內容也不可能涵蓋所有 JPA 相關內容,我只是把自己覺得比較重要的知識點總結在了下面。很多地方我自己也是參考著官方文檔寫的,官方文檔非常詳細了,非常推薦閱讀一下。這篇文章可以幫助對 JPA 不了解或者不太熟悉的人來在實際項目中正確使用 JPA。

[[279563]]

另外,我發現網上關于連表查詢這一塊并沒有太多比較有參考價值的博客,所以對這部分也做了詳細的總結,以供大家學習參考。

項目代碼基于 Spring Boot 最新的 2.1.9.RELEASE 版本構建(截止到這篇文章寫完),另外,新建項目的過程就不多說了。

一 JPA 基礎:常見操作

1.相關依賴

我們需要下面這些依賴支持我們完成這部分內容的學習:

  1. <dependencies> 
  2.         <dependency> 
  3.             <groupId>org.springframework.boot</groupId> 
  4.             <artifactId>spring-boot-starter-web</artifactId> 
  5.         </dependency> 
  6.         <dependency> 
  7.             <groupId>org.springframework.boot</groupId> 
  8.             <artifactId>spring-boot-starter-data-jpa</artifactId> 
  9.         </dependency> 
  10.         <dependency> 
  11.             <groupId>mysql</groupId> 
  12.             <artifactId>mysql-connector-java</artifactId> 
  13.             <scope>runtime</scope> 
  14.         </dependency> 
  15.         <dependency> 
  16.             <groupId>org.projectlombok</groupId> 
  17.             <artifactId>lombok</artifactId> 
  18.             <optional>true</optional> 
  19.         </dependency> 
  20.         <dependency> 
  21.             <groupId>org.springframework.boot</groupId> 
  22.             <artifactId>spring-boot-starter-test</artifactId> 
  23.             <scope>test</scope> 
  24.         </dependency> 
  25.     </dependencies> 

2.配置數據庫連接信息和JPA配置

下面的配置中需要單獨說一下 spring.jpa.hibernate.ddl-auto=create這個配置選項。

這個屬性常用的選項有四種:

  1. create:每次重新啟動項目都會重新創新表結構,會導致數據丟失
  2. create-drop:每次啟動項目創建表結構,關閉項目刪除表結構
  3. update:每次啟動項目會更新表結構
  4. validate:驗證表結構,不對數據庫進行任何更改

但是,一定要不要在生產環境使用 ddl 自動生成表結構,一般推薦手寫 SQL 語句配合 Flyway 來做這些事情。

  1. spring.datasource.url=jdbc:mysql://localhost:3306/springboot_jpa?useSSL=false&serverTimezone=CTT 
  2. spring.datasource.username=root 
  3. spring.datasource.password=123456 
  4. # 打印出 sql 語句 
  5. spring.jpa.show-sql=true 
  6. spring.jpa.hibernate.ddl-auto=create 
  7. spring.jpa.open-in-view=false 
  8. # 創建的表的 ENGINE 為 InnoDB 
  9. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect 

3.實體類

我們為這個類添加了 @Entity 注解代表它是數據庫持久化類,還配置了主鍵 id。

  1. import lombok.Data; 
  2. import lombok.NoArgsConstructor; 
  3.  
  4. import javax.persistence.Column
  5. import javax.persistence.Entity; 
  6. import javax.persistence.GeneratedValue; 
  7. import javax.persistence.GenerationType; 
  8. import javax.persistence.Id; 
  9.  
  10. @Entity 
  11. @Data 
  12. @NoArgsConstructor 
  13. public class Person { 
  14.      
  15.     @Id 
  16.     @GeneratedValue(strategy = GenerationType.IDENTITY) 
  17.     private Long id; 
  18.     @Column(unique = true
  19.     private String name
  20.     private Integer age; 
  21.  
  22.     public Person(String nameInteger age) { 
  23.         this.name = name
  24.         this.age = age; 
  25.     } 
  26.  

如何檢驗你是否正確完成了上面 3 步?很簡單,運行項目,查看數據如果發現控制臺打印出創建表的 sql 語句,并且數據庫中表真的被創建出來的話,說明你成功完成前面 3 步。

控制臺打印出來的 sql 語句類似下面這樣:

  1. drop table if exists person 
  2. CREATE TABLE `person` ( 
  3.   `id` bigint(20) NOT NULL AUTO_INCREMENT, 
  4.   `age` int(11) DEFAULT NULL
  5.   `namevarchar(255) DEFAULT NULL, 
  6.    PRIMARY KEY (`id`) 
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  8. alter table person add constraint UK_p0wr4vfyr2lyifm8avi67mqw5 unique (name

4.創建操作數據庫的 Repository 接口

  1. @Repository 
  2. public interface PersonRepository extends JpaRepository<Person, Long> { 

首先這個接口加了 @Repository 注解,代表它和數據庫操作有關。另外,它繼承了 JpaRepository接口,而JpaRepository長這樣:

  1. @NoRepositoryBean 
  2. public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { 
  3.     List<T> findAll(); 
  4.  
  5.     List<T> findAll(Sort var1); 
  6.  
  7.     List<T> findAllById(Iterable<ID> var1); 
  8.  
  9.     <S extends T> List<S> saveAll(Iterable<S> var1); 
  10.  
  11.     void flush(); 
  12.  
  13.     <S extends T> S saveAndFlush(S var1); 
  14.  
  15.     void deleteInBatch(Iterable<T> var1); 
  16.  
  17.     void deleteAllInBatch(); 
  18.  
  19.     T getOne(ID var1); 
  20.  
  21.     <S extends T> List<S> findAll(Example<S> var1); 
  22.  
  23.     <S extends T> List<S> findAll(Example<S> var1, Sort var2); 

這表明我們只要繼承了JpaRepository 就具有了 JPA 為我們提供好的增刪改查、分頁查詢以及根據條件查詢等方法。

4.1 JPA 自帶方法實戰

1) 增刪改查

1.保存用戶到數據庫

  1. Person person = new Person("SnailClimb", 23); 
  2.    personRepository.save(person); 

save()方法對應 sql 語句就是:insert into person (age, name) values (23,"snailclimb")

2.根據 id 查找用戶

  1. Optional<Person> personOptional = personRepository.findById(id); 

findById()方法對應 sql 語句就是:select * from person p where p.id = id

3.根據 id 刪除用戶

  1. personRepository.deleteById(id); 

deleteById()方法對應 sql 語句就是:delete from person where id=id

4.更新用戶

更新操作也要通過 save()方法來實現,比如:

  1. Person person = new Person("SnailClimb", 23); 
  2.     Person savedPerson = personRepository.save(person); 
  3.     // 更新 person 對象的姓名 
  4.     savedPerson.setName("UpdatedName"); 
  5.     personRepository.save(savedPerson); 

在這里 save()方法相當于 sql 語句:update person set name="UpdatedName" where id=id

2) 帶條件的查詢

下面這些方法是我們根據 JPA 提供的語法自定義的,你需要將下面這些方法寫到 PersonRepository 中。

假如我們想要根據 Name 來查找 Person ,你可以這樣:

  1. Optional<Person> findByName(String name); 

如果你想要找到年齡大于某個值的人,你可以這樣:

  1. List<Person> findByAgeGreaterThan(int age); 

4.2 自定義 SQL 語句實戰

很多時候我們自定義 sql 語句會非常有用。

根據 name 來查找 Person:

  1. @Query("select p from Person p where p.name = :name"
  2.     Optional<Person> findByNameCustomeQuery(@Param("name") String name); 

Person 部分屬性查詢,避免 select *操作:

  1. @Query("select p.name from Person p where p.id = :id"
  2.     String findPersonNameById(@Param("id") Long id); 

根據 id 更新Person name:

  1. @Modifying 
  2.     @Transactional 
  3.     @Query("update Person p set p.name = ?1 where p.id = ?2"
  4.     void updatePersonNameById(String name, Long id); 

4.3 創建異步方法

如果我們需要創建異步方法的話,也比較方便。

異步方法在調用時立即返回,然后會被提交給TaskExecutor執行。當然你也可以選擇得出結果后才返回給客戶端。如果對 Spring Boot 異步編程感興趣的話可以看這篇文章:《新手也能看懂的 SpringBoot 異步編程指南》 。

  1. @Async 
  2. Future<User> findByName(String name); 
  3.  
  4. @Async 
  5. CompletableFuture<User> findByName(String name); 

5.測試類和源代碼地址

測試類:

  1. @SpringBootTest 
  2. @RunWith(SpringRunner.class) 
  3. public class PersonRepositoryTest { 
  4.     @Autowired 
  5.     private PersonRepository personRepository; 
  6.     private Long id; 
  7.  
  8.     /** 
  9.      * 保存person到數據庫 
  10.      */ 
  11.     @Before 
  12.     public void setUp() { 
  13.         assertNotNull(personRepository); 
  14.         Person person = new Person("SnailClimb", 23); 
  15.         Person savedPerson = personRepository.saveAndFlush(person);// 更新 person 對象的姓名 
  16.         savedPerson.setName("UpdatedName"); 
  17.         personRepository.save(savedPerson); 
  18.  
  19.         id = savedPerson.getId(); 
  20.     } 
  21.  
  22.     /** 
  23.      * 使用 JPA 自帶的方法查找 person 
  24.      */ 
  25.     @Test 
  26.     public void should_get_person() { 
  27.         Optional<Person> personOptional = personRepository.findById(id); 
  28.         assertTrue(personOptional.isPresent()); 
  29.         assertEquals("SnailClimb", personOptional.get().getName()); 
  30.         assertEquals(Integer.valueOf(23), personOptional.get().getAge()); 
  31.  
  32.         List<Person> personList = personRepository.findByAgeGreaterThan(18); 
  33.         assertEquals(1, personList.size()); 
  34.         // 清空數據庫 
  35.         personRepository.deleteAll(); 
  36.     } 
  37.  
  38.     /** 
  39.      * 自定義 query sql 查詢語句查找 person 
  40.      */ 
  41.  
  42.     @Test 
  43.     public void should_get_person_use_custom_query() { 
  44.         // 查找所有字段 
  45.         Optional<Person> personOptional = personRepository.findByNameCustomeQuery("SnailClimb"); 
  46.         assertTrue(personOptional.isPresent()); 
  47.         assertEquals(Integer.valueOf(23), personOptional.get().getAge()); 
  48.         // 查找部分字段 
  49.         String personName = personRepository.findPersonNameById(id); 
  50.         assertEquals("SnailClimb", personName); 
  51.         System.out.println(id); 
  52.         // 更新 
  53.         personRepository.updatePersonNameById("UpdatedName", id); 
  54.         Optional<Person> updatedName = personRepository.findByNameCustomeQuery("UpdatedName"); 
  55.         assertTrue(updatedName.isPresent()); 
  56.         // 清空數據庫 
  57.         personRepository.deleteAll(); 
  58.     } 
  59.  

源代碼地址:https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/jpa-demo

6. 總結

本文主要介紹了 JPA 的基本用法:

使用 JPA 自帶的方法進行增刪改查以及條件查詢。

自定義 SQL 語句進行查詢或者更新數據庫。

創建異步的方法。

在下一篇關于 JPA 的文章中我會介紹到非常重要的兩個知識點:

基本分頁功能實現

多表聯合查詢以及多表聯合查詢下的分頁功能實現。

二 JPA 連表查詢和分頁

對于連表查詢,在 JPA 中還是非常常見的,由于 JPA 可以在 respository 層自定義 SQL 語句,所以通過自定義 SQL 語句的方式實現連表還是挺簡單。這篇文章是在上一篇入門 JPA的文章的基礎上寫的,不了解 JPA 的可以先看上一篇文章。

在上一節的基礎上我們新建了兩個實體類,如下:

1.相關實體類創建

  1. Company.java 
  2. @Entity 
  3. @Data 
  4. @NoArgsConstructor 
  5. public class Company { 
  6.     @Id 
  7.     @GeneratedValue(strategy = GenerationType.IDENTITY) 
  8.     private Long id; 
  9.     @Column(unique = true
  10.     private String companyName; 
  11.     private String description; 
  12.  
  13.     public Company(String name, String description) { 
  14.         this.companyName = name
  15.         this.description = description; 
  16.     } 
  17. School.java 
  18. @Entity 
  19. @Data 
  20. @NoArgsConstructor 
  21. @AllArgsConstructor 
  22. public class School { 
  23.     @Id 
  24.     @GeneratedValue(strategy = GenerationType.IDENTITY) 
  25.     private Long id; 
  26.     @Column(unique = true
  27.     private String name
  28.     private String description; 

2.自定義 SQL語句實現連表查詢

假如我們當前要通過 person 表的 id 來查詢 Person 的話,我們知道 Person 的信息一共分布在Company、School、Person這三張表中,所以,我們如果要把 Person 的信息都查詢出來的話是需要進行連表查詢的。

首先我們需要創建一個包含我們需要的 Person 信息的 DTO 對象,我們簡單第將其命名為 UserDTO,用于保存和傳輸我們想要的信息。

  1. @Data 
  2. @NoArgsConstructor 
  3. @Builder(toBuilder = true
  4. @AllArgsConstructor 
  5. public class UserDTO { 
  6.     private String name
  7.     private int age; 
  8.     private String companyName; 
  9.     private String schoolName; 

下面我們就來寫一個方法查詢出 Person 的基本信息。

  1. /** 
  2.    * 連表查詢 
  3.    */ 
  4.   @Query(value = "select new github.snailclimb.jpademo.model.dto.UserDTO(p.name,p.age,c.companyName,s.name) " + 
  5.           "from Person p left join Company c on  p.companyId=c.id " + 
  6.           "left join School s on p.schoolId=s.id " + 
  7.           "where p.id=:personId"
  8.   Optional<UserDTO> getUserInformation(@Param("personId") Long personId); 

可以看出上面的 sql 語句和我們平時寫的沒啥區別,差別比較大的就是里面有一個 new 對象的操作。

3.自定義 SQL 語句連表查詢并實現分頁操作

假如我們要查詢當前所有的人員信息并實現分頁的話,你可以按照下面這種方式來做。可以看到,為了實現分頁,我們在@Query注解中還添加了 countQuery 屬性。

  1. @Query(value = "select new github.snailclimb.jpademo.model.dto.UserDTO(p.name,p.age,c.companyName,s.name) " + 
  2.         "from Person p left join Company c on  p.companyId=c.id " + 
  3.         "left join School s on p.schoolId=s.id "
  4.         countQuery = "select count(p.id) " + 
  5.                 "from Person p left join Company c on  p.companyId=c.id " + 
  6.                 "left join School s on p.schoolId=s.id "
  7. Page<UserDTO> getUserInformationList(Pageable pageable); 

實際使用:

  1. //分頁選項 
  2. PageRequest pageRequest = PageRequest.of(0, 3, Sort.Direction.DESC"age"); 
  3. Page<UserDTO> userInformationList = personRepository.getUserInformationList(pageRequest); 
  4. //查詢結果總數 
  5. System.out.println(userInformationList.getTotalElements());// 6 
  6. //按照當前分頁大小,總頁數 
  7. System.out.println(userInformationList.getTotalPages());// 2 
  8. System.out.println(userInformationList.getContent()); 

4.加餐:自定以SQL語句的其他用法

下面我只介紹兩種比較常用的:

IN 查詢

BETWEEN 查詢

當然,還有很多用法需要大家自己去實踐了。

4.1 IN 查詢

在 sql 語句中加入我們需要篩選出符合幾個條件中的一個的情況下,可以使用 IN 查詢,對應到 JPA 中也非常簡單。比如下面的方法就實現了,根據名字過濾需要的人員信息。

  1. @Query(value = "select new github.snailclimb.jpademo.model.dto.UserDTO(p.name,p.age,c.companyName,s.name) " + 
  2.         "from Person p left join Company c on  p.companyId=c.id " + 
  3.         "left join School s on p.schoolId=s.id " + 
  4.         "where p.name IN :peopleList"
  5. List<UserDTO> filterUserInfo(List peopleList); 

實際使用:

List personList=new ArrayList<>(Arrays.asList("person1","person2"));List userDTOS = personRepository.filterUserInfo(personList);

4.2 BETWEEN 查詢

查詢滿足某個范圍的值。比如下面的方法就實現查詢滿足某個年齡范圍的人員的信息。

  1. @Query(value = "select new github.snailclimb.jpademo.model.dto.UserDTO(p.name,p.age,c.companyName,s.name) " + 
  2.             "from Person p left join Company c on  p.companyId=c.id " + 
  3.             "left join School s on p.schoolId=s.id " + 
  4.             "where p.age between :small and :big"
  5.     List<UserDTO> filterUserInfoByAge(int small,int big); 

實際使用:

List userDTOS = personRepository.filterUserInfoByAge(19,20);

5.測試類和源代碼地址

  1. @SpringBootTest 
  2. @RunWith(SpringRunner.class) 
  3. public class PersonRepositoryTest2 { 
  4.     @Autowired 
  5.     private PersonRepository personRepository; 
  6.  
  7.     @Sql(scripts = {"classpath:/init.sql"}) 
  8.     @Test 
  9.     public void find_person_age_older_than_18() { 
  10.         List<Person> personList = personRepository.findByAgeGreaterThan(18); 
  11.         assertEquals(1, personList.size()); 
  12.     } 
  13.  
  14.     @Sql(scripts = {"classpath:/init.sql"}) 
  15.     @Test 
  16.     public void should_get_user_info() { 
  17.         Optional<UserDTO> userInformation = personRepository.getUserInformation(1L); 
  18.         System.out.println(userInformation.get().toString()); 
  19.     } 
  20.  
  21.     @Sql(scripts = {"classpath:/init.sql"}) 
  22.     @Test 
  23.     public void should_get_user_info_list() { 
  24.         PageRequest pageRequest = PageRequest.of(0, 3, Sort.Direction.DESC"age"); 
  25.         Page<UserDTO> userInformationList = personRepository.getUserInformationList(pageRequest); 
  26.         //查詢結果總數 
  27.         System.out.println(userInformationList.getTotalElements());// 6 
  28.         //按照當前分頁大小,總頁數 
  29.         System.out.println(userInformationList.getTotalPages());// 2 
  30.         System.out.println(userInformationList.getContent()); 
  31.     } 
  32.  
  33.     @Sql(scripts = {"classpath:/init.sql"}) 
  34.     @Test 
  35.     public void should_filter_user_info() { 
  36.         List<String> personList=new ArrayList<>(Arrays.asList("person1","person2")); 
  37.         List<UserDTO> userDTOS = personRepository.filterUserInfo(personList); 
  38.         System.out.println(userDTOS); 
  39.     } 
  40.  
  41.     @Sql(scripts = {"classpath:/init.sql"}) 
  42.     @Test 
  43.     public void should_filter_user_info_by_age() { 
  44.         List<UserDTO> userDTOS = personRepository.filterUserInfoByAge(19,20); 
  45.         System.out.println(userDTOS); 
  46.     } 

六 總結

本節我們主要學習了下面幾個知識點:

自定義 SQL 語句實現連表查詢;

自定義 SQL 語句連表查詢并實現分頁操作;

條件查詢:IN 查詢,BETWEEN查詢。

我們這一節是把 SQl 語句連表查詢的邏輯放在 Dao 層直接寫的,這樣寫的好處是比較方便,也比較簡單明了。但是可能會不太好維護,很多時候我們會選擇將這些邏輯放到 Service 層去做,這樣也是可以實現的,后面章我就會介紹到如何將這些寫在 Dao 層的邏輯轉移到 Service 層去。

代碼地址:https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/jpa-demo 

 

責任編輯:武曉燕 來源: JavaGuide
相關推薦

2024-06-05 11:43:10

2023-10-21 20:50:00

Python項目PyCharm

2023-11-18 23:39:37

JavaSpringHTTP

2024-04-12 12:19:08

語言模型AI

2022-03-24 08:51:48

Redis互聯網NoSQL

2023-11-26 18:31:41

Linux信號

2015-08-05 09:33:21

Javawaitnotify

2023-09-08 08:20:46

ThreadLoca多線程工具

2021-03-22 10:05:59

netstat命令Linux

2023-09-15 12:00:01

API應用程序接口

2025-01-26 15:02:47

2021-02-22 09:44:03

KubernetesDNSLinux

2021-10-25 09:00:37

Node.jsJS前端

2023-04-03 15:04:00

RPCPHP語言

2023-08-24 16:50:45

2020-03-18 14:00:47

MySQL分區數據庫

2019-11-19 08:00:00

神經網絡AI人工智能

2023-10-16 08:16:31

Bean接口類型

2021-06-30 08:45:02

內存管理面試

2022-06-07 10:13:22

前端沙箱對象
點贊
收藏

51CTO技術棧公眾號

亚洲日本精品国产第一区| 高清欧美电影在线| 伊人网在线综合| 99福利在线| 成人动漫中文字幕| 国产97在线播放| 亚洲女人毛茸茸高潮| 在线日韩成人| 91久久精品日日躁夜夜躁欧美| 亚欧精品在线| 性一交一乱一精一晶| 免费中文字幕日韩欧美| 日韩中文字幕网站| 亚洲精品中文字幕在线播放| 欧美free嫩15| 一区二区欧美视频| 日韩一本精品| 亚洲精品视频网| 日韩在线卡一卡二| 久久久久中文字幕| 手机av在线不卡| 果冻天美麻豆一区二区国产| 欧美日韩国产一级| 1024av视频| av免费在线免费| 国产欧美一二三区| 国偷自产av一区二区三区小尤奈| 在线免费看av的网站| 亚洲精品综合| 久久综合国产精品台湾中文娱乐网| 日本一区二区三区网站| 欧洲大片精品免费永久看nba| 色综合天天综合色综合av| 国产av熟女一区二区三区| h视频网站在线观看| 99久久精品免费看| 91手机在线观看| 又骚又黄的视频| 久久精品免费| 欧美亚洲国产视频| 国产无套在线观看| 欧美日韩亚洲一区三区| 久久精品中文字幕| 久久久久久久久福利| 亚洲肉体裸体xxxx137| 日韩精品影音先锋| 香蕉视频色在线观看| 国产91精品在线| 色综合久久99| 成人综合视频在线| 嗯~啊~轻一点视频日本在线观看| 亚洲精选视频免费看| 午夜精品美女久久久久av福利| 午夜视频1000| 成人精品国产福利| 国产chinese精品一区二区| 国产乱淫片视频| 久久精品国产99久久6| 国产精品亚洲视频在线观看| 成人一级免费视频| 日日夜夜精品视频天天综合网| 欧美性受xxxx白人性爽| 国产奶水涨喷在线播放| 91久久亚洲| 久久青草福利网站| 成年人免费看毛片| 欧美亚洲在线| 国产成人福利网站| 夜夜躁日日躁狠狠久久av| 日韩成人dvd| 国产精品视频一| 亚洲字幕av一区二区三区四区| 久久国产精品露脸对白| 成人黄色短视频在线观看| 国产又粗又猛又黄又爽| 国产精品自在欧美一区| 99精品国产高清在线观看| 亚洲美女性生活| 91视频精品在这里| 色播亚洲视频在线观看| 老司机午夜在线| 亚洲免费视频中文字幕| 久久亚洲精品无码va白人极品| 91九色在线看| 欧美午夜宅男影院在线观看| 国产精品无码一本二本三本色| 成人黄页网站视频| 欧美一区二区三区系列电影| 乳色吐息在线观看| 少妇精品导航| 深夜福利国产精品| 久草免费在线视频观看| 午夜亚洲性色福利视频| 国产欧美一区二区白浆黑人| 亚洲xxx在线| 91一区一区三区| 亚州欧美一区三区三区在线| www久久日com| 富二代精品短视频| xx欧美撒尿嘘撒尿xx| 日本一区二区乱| 日韩电影中文字幕| 亚洲熟女少妇一区二区| 影音先锋中文字幕一区| 国产成人jvid在线播放| www.国产免费| 国产校园另类小说区| 色爽爽爽爽爽爽爽爽| 日本乱码一区二区三区不卡| 欧美日韩一级二级| 国产精品九九视频| 四虎成人av| 2019中文字幕全在线观看| 伊人网站在线观看| 91在线一区二区| 手机成人av在线| 亚洲少妇视频| 日韩三级视频在线看| 国产又大又粗又爽的毛片| 欧美91精品| 国产精品日韩欧美| 无码国产色欲xxxx视频| av网站免费在线看| 亚洲国产高清一区| 亚洲一区二区三区成人在线视频精品| 日产精品久久久久久久性色| 一区二区三区国产精品| 超碰在线人人爱| 欧美爱爱网站| 九九九久久久久久| 国产精品久久久国产盗摄| 久久一区二区视频| 欧美午夜性视频| 成人国产精品久久| 91在线视频网址| 亚洲成国产人片在线观看| 虎白女粉嫩尤物福利视频| 97久久精品| 久久激情视频久久| 中文字幕久久熟女蜜桃| 久久午夜免费电影| 黄色国产一级视频| 视频二区欧美毛片免费观看| 久久久久www| 中文字幕一区二区三区四区免费看| 91丨porny丨最新| 精品国产av无码一区二区三区| 日韩精品一区二区三区中文字幕 | 欧美性受xxxx黑人| 久久最新视频| 欧美另类一区| 亚洲欧美韩国| 精品香蕉在线观看视频一| 日韩三级免费看| 岛国精品一区二区| www.国产在线播放| 国产精品久久久久av蜜臀| 欧美大片在线影院| 亚洲精选一区二区三区| 亚洲一区二区中文在线| 少妇伦子伦精品无吗| 狠狠爱综合网| 懂色av一区二区三区在线播放| 尤物在线网址| 精品欧美乱码久久久久久| 精品在线视频观看| 99国产精品久久久久| 国产在线青青草| 免费看av成人| 国产精品久久婷婷六月丁香| 自拍视频在线| 在线综合视频播放| 麻豆91精品91久久久| 床上的激情91.| 免费看又黄又无码的网站| 亚洲制服一区| 国产美女扒开尿口久久久| 黄色一级片在线观看| 日韩视频免费观看高清在线视频| 国产亚洲精品av| 99久久99久久精品免费看蜜桃| 国产aaa一级片| 精品一区二区三区在线| 91精品国产综合久久男男| 中国av在线播放| 日韩h在线观看| 伊人亚洲综合网| 亚洲柠檬福利资源导航| 国产熟女高潮一区二区三区| 老司机精品视频网站| 自拍另类欧美| 极品束缚调教一区二区网站| 国产成人精品日本亚洲| 黄色大片在线播放| 亚洲第一偷拍网| 波多野结衣小视频| 亚洲激情图片一区| 亚洲AV无码片久久精品| 国产专区综合网| 日韩a∨精品日韩在线观看| 精品日韩欧美一区| 丁香五月网久久综合| 成人免费在线观看视频| 欧美风情在线观看| 国产香蕉视频在线看| 日韩一级片网址| 日本a级c片免费看三区| 国产精品国产a级| 88av在线播放| 国内久久婷婷综合| 日韩欧美视频网站| 亚洲影视一区二区三区| 久久精品久久精品国产大片| 日韩国产91| 26uuu久久噜噜噜噜| 哥也色在线视频| 亚洲无限av看| 国产91免费在线观看| 欧美挠脚心视频网站| 国产午夜在线播放| 一区二区三区免费观看| 国产在视频线精品视频| 91日韩精品一区| 免费黄色a级片| 黑人精品欧美一区二区蜜桃| 99久久激情视频| 激情欧美一区二区三区| 在线观看成人av电影| 国产99久久久国产精品成人免费| αv一区二区三区| 免费成人高清在线视频| 国产成人精品网站| 少妇视频一区| 久久久亚洲精选| 18av在线播放| 久久综合国产精品台湾中文娱乐网| 国产二区在线播放| 亚洲社区在线观看| 手机看片福利在线观看| 亚洲成人久久久| 亚洲风情第一页| 91精品免费在线观看| 一二三四区视频| 日本高清不卡一区| 男人的天堂av网站| 色婷婷综合久久久中文一区二区 | 亚洲国产高清在线| 88久久精品无码一区二区毛片| 成人av资源站| 中文字幕乱码一区| 97精品视频在线观看自产线路二| 美女久久久久久久久| 国产iv一区二区三区| 一级 黄 色 片一| 国产在线播放一区| 中文字幕在线观看视频www| 国产精品亚洲视频| 一区二区三区四区影院| 国产成人精品免费| 久久性爱视频网站| 99国产精品国产精品久久| 国产麻豆天美果冻无码视频 | 精品久久久视频| 日韩av在线天堂| 欧美日韩人人澡狠狠躁视频| 日本韩国欧美中文字幕| 色婷婷精品大在线视频| 亚洲精品国产精品国自产网站按摩| 欧洲精品在线观看| 97成人在线观看| 欧美一区二区免费视频| 午夜精品久久久久久久第一页按摩| 精品日韩成人av| 五月天婷婷社区| 国产亚洲美女久久| 国产在线69| 国模吧一区二区三区| 蜜桃麻豆影像在线观看| 国产精品电影网| 国产美女亚洲精品7777| 国产乱码精品一区二区三区卡 | 成人av资源在线播放| 久久久久毛片免费观看| 国产在线精品一区二区三区| 欧美女优在线视频| 欧美aaa在线观看| 欧美视频导航| 国产又大又硬又粗| 日本亚洲天堂网| 国产又粗又猛又爽又黄| 97se狠狠狠综合亚洲狠狠| 亚洲精品国产精品国自| 亚洲伊人色欲综合网| 亚洲成人第一网站| 日韩一区二区精品| 日韩三级电影网| 久久精品国产亚洲7777| 久草免费在线视频| 国产精品爽黄69天堂a| 高清一区二区三区| 亚洲亚洲精品三区日韩精品在线视频 | 韩国在线一区| 男人的天堂日韩| 成人美女视频在线观看| а天堂中文在线资源| 精品高清一区二区三区| 一二区在线观看| 亚洲欧美成人精品| 欧美精品videosex| 国产精品尤物福利片在线观看| 国产精品视频3p| 亚洲一区二区三区乱码| 先锋影音久久| 香蕉视频免费网站| 中文字幕亚洲欧美在线不卡| 亚洲婷婷综合网| 日韩精品一区二区三区视频| a黄色在线观看| 7777免费精品视频| 日韩av综合| 亚洲人一区二区| 久久久久99| 国产毛片毛片毛片毛片毛片毛片| 色妞在线综合亚洲欧美| 激情图片在线观看高清国产| 国产精品自拍网| 日韩欧美四区| 欧美精品在欧美一区二区| 日本女人一区二区三区| 中文字幕免费在线播放| 夜夜精品视频一区二区| 一级黄色短视频| 国产亚洲综合久久| 亚洲性受xxx喷奶水| 久久久www成人免费毛片麻豆| av动漫免费观看| 日日夜夜免费精品| 精品人妻一区二区三区香蕉| 亚洲国产精品一区二区www| 国产成人精品无码高潮| 久久亚洲精品小早川怜子66| 日韩一区二区三区免费视频| 久久av免费观看| 99精品国产在热久久下载| 免费看三级黄色片| 亚洲精品亚洲人成人网| av观看在线免费| 久久中文字幕一区| 九九99久久精品在免费线bt| 一区二区91美女张开腿让人桶| 小嫩嫩精品导航| 9.1成人看片| 天天综合色天天综合| 无码国产伦一区二区三区视频 | 思思99re6国产在线播放| 国产精品久久久久久久久久新婚 | 亚洲高清资源综合久久精品| 久久男女视频| 第一次破处视频| 91国偷自产一区二区三区观看| 美女毛片在线看| 国产成+人+综合+亚洲欧洲| 欧美理论在线播放| 日韩肉感妇bbwbbwbbw| 国产精品沙发午睡系列990531| 五月天中文字幕| 日韩在线观看精品| 日本一区二区三区电影免费观看| 少妇大叫太大太粗太爽了a片小说| 成人久久18免费网站麻豆| 六月丁香在线视频| 亚洲性av网站| 青草综合视频| 蜜臀av性久久久久蜜臀av| 国产成人av一区二区三区在线 | 亚洲 欧美 自拍偷拍| 青草青草久热精品视频在线网站| 国产成人影院| 国产美女视频免费看| 亚洲综合色区另类av| 日韩大胆人体| 国产欧美精品在线| 欧美午夜精品| 亚洲中文字幕无码av| 在线精品视频小说1| 成人区精品一区二区不卡| 国产一级精品aaaaa看| 日韩电影在线看| 午夜免费激情视频| 亚洲美女喷白浆| 欧美风情在线视频| xxxx18hd亚洲hd捆绑| 欧美激情一区二区在线| jizz中国女人| 日本aⅴ大伊香蕉精品视频| 四季av一区二区三区免费观看| 少妇搡bbbb搡bbb搡打电话| 色哟哟国产精品| 91极品在线| 欧洲视频一区二区三区|