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

開始使用 Spring Data JPA

開發(fā) 后端
在我們剛剛發(fā)布項(xiàng)目Spring Data JPA的第一個(gè)里程碑時(shí),我想給你一個(gè)關(guān)于它的簡要介紹.正如你所知道的,Spring framework 對(duì)于基于JPA的數(shù)據(jù)存取層提供了支持.那么 Spring Data JPA 是如何添加到Spring中的呢?回答這個(gè)問題,我想從一個(gè)數(shù)據(jù)存取組件開始。

在我們剛剛發(fā)布項(xiàng)目Spring Data JPA的第一個(gè)里程碑時(shí),我想給你一個(gè)關(guān)于它的簡要介紹.正如你所知道的,Spring framework 對(duì)于基于JPA的數(shù)據(jù)存取層提供了支持。那么 Spring Data JPA 是如何添加到Spring中的呢?回答這個(gè)問題,我想從一個(gè)數(shù)據(jù)存取組件開始。這個(gè)組件提供了一個(gè)簡單的域(domain),它是用純JPA和 Spring實(shí)現(xiàn)的,而且可以擴(kuò)展和改進(jìn)。在我們實(shí)現(xiàn)之后,我將用Spring Data JPA 來重構(gòu)它。你在以在 GitHub上找到這個(gè)小項(xiàng)目的每一次重構(gòu)的詳細(xì)指導(dǎo)。

域(The domain)

為了保持簡單,我從最簡單常用的域開始:客戶(Customer)和帳號(hào)(Account)

  1. @Entity 
  2. public class Customer {  
  3.  
  4.   @Id 
  5.   @GeneratedValue(strategy = GenerationType.AUTO)  
  6.   private Long id;  
  7.  
  8.   private String firstname;  
  9.   private String lastname;  
  10.  
  11.   // … methods omitted  
  1. @Entity 
  2. public class Account {  
  3.  
  4.   @Id 
  5.   @GeneratedValue(strategy = GenerationType.AUTO)  
  6.   private Long id;  
  7.  
  8.   @ManyToOne 
  9.   private Customer customer;  
  10.  
  11.   @Temporal(TemporalType.DATE)  
  12.   private Date expiryDate;  
  13.  
  14.   // … methods omitted  

帳戶只有一個(gè)到期日(expriyDate).再無其他. - 它使用JPA注解.現(xiàn)在我們來看看管理帳號(hào)的組件.

  1. @Repository 
  2. @Transactional(readOnly = true)  
  3. class AccountServiceImpl implements AccountService {  
  4.  
  5.   @PersistenceContext 
  6.   private EntityManager em;  
  7.  
  8.   @Override 
  9.   @Transactional 
  10.   public Account save(Account account) {  
  11.  
  12.     if (account.getId() == null) {  
  13.       em.persist(account);  
  14.       return account;  
  15.     } else {  
  16.       return em.merge(account);  
  17.     }  
  18.   }  
  19.  
  20.   @Override 
  21.   public List<Account> findByCustomer(Customer customer) {  
  22.  
  23.     TypedQuery query = em.createQuery("select a from Account a where a.customer = ?1", Account.class);  
  24.     query.setParameter(1, customer);  
  25.  
  26.     return query.getResultList();  
  27.   }  

為了在后面重構(gòu)引入存儲(chǔ)層(repository layer)時(shí)不引起名稱沖突,我特意命名為 class*Service.但是在概念上,這個(gè)類是一個(gè)存儲(chǔ)對(duì)象,而不是服務(wù).事實(shí)上我們有嗎?

這個(gè)被@Repository 注釋的類拋出的異常可以被Spring的DataAccessException捕獲。另外我們還用到了@Transactional 來保證 save(...) 操作的事務(wù)性和該類其他方法(這里是findByCustomer(...))的事務(wù)只讀標(biāo)識(shí)。這樣會(huì)對(duì)數(shù)據(jù)庫性能和我們持久化提供器的性能有一定的優(yōu)化。

由于我們不想讓程序員去決定什么時(shí)候調(diào)用EntityManager的merge(...)或者persist(...)方法。我們用了實(shí)體類主鍵字段內(nèi)容來判斷到底調(diào)用哪一個(gè)。這是判斷邏輯是全局通用的所以不用對(duì)每一個(gè)域?qū)ο蠖既ヂ暶鲗?shí)現(xiàn)。查詢方法也是很直觀的,我們寫一個(gè)查詢,綁定一個(gè)參數(shù)然后執(zhí)行這條查詢并取得結(jié)果。這個(gè)方法名其實(shí)已經(jīng)很直觀了,其實(shí)我們可以根據(jù)方法名就推出查詢語句,所以這里是可以提升一下的。(在后面可以直接按照這樣的模式寫方法名和參數(shù)而不需要去寫實(shí)現(xiàn),SPRING DATA JPA會(huì)根據(jù)你方法的命名自動(dòng)轉(zhuǎn)成SQL。(如果配合良好的數(shù)據(jù)庫設(shè)計(jì)和視圖設(shè)計(jì),省了不少事情))

Spring Data 存儲(chǔ)庫支持

在我們開始重構(gòu)該實(shí)現(xiàn)之前,看一下示例項(xiàng)目中包含的那些在重構(gòu)課程中能夠運(yùn)行的測(cè)試用例,確保那些代碼現(xiàn)在依舊能用。下面我們就來看如何改善我們的實(shí)現(xiàn)類。

Spring Data JPA 提供了一個(gè)存儲(chǔ)庫編程模型,首先,每一個(gè)受管理的領(lǐng)域?qū)ο蠖家幸粋€(gè)接口:

  1. public interface AccountRepository extends JpaRepository<Account, Long> { … } 

定義這個(gè)接口是出于兩個(gè)目的:首先,通過繼承JpaRepository我們獲得了一組泛型的CRUD方法,使我們能保存Accounts,刪除它們等等。其次,這使得Spring Data JPA存儲(chǔ)庫框架在classpath中掃描該接口,并為它創(chuàng)建一個(gè)Spring bean。

為了讓Spring創(chuàng)建一個(gè)實(shí)現(xiàn)該接口的bean,你僅需要使用Sping JPA"命名空間"并用適當(dāng)元素激活其對(duì)repository 的支持。

  1. <jpa:repositories base-package="com.acme.repositories" />  

這將掃描包含在包(package)com.acme.repositories下所有的繼承于JpaRepository的接口,并為該接口創(chuàng)建實(shí)現(xiàn)了SimpleJpaRepository的Sping bean。下面讓我們邁出第一步,稍微重構(gòu)我們的AccountService實(shí)現(xiàn)以便使用我們新介紹的repository接口。

  1. @Repository 
  2. @Transactional(readOnly = true)  
  3. class AccountServiceImpl implements AccountService {  
  4.  
  5.   @PersistenceContext 
  6.   private EntityManager em;  
  7.  
  8.   @Autowired 
  9.   private AccountRepository repository;  
  10.  
  11.   @Override 
  12.   @Transactional 
  13.   public Account save(Account account) {  
  14.     return repository.save(account);  
  15.   }  
  16.  
  17.   @Override 
  18.   public List<Account> findByCustomer(Customer customer) {  
  19.  
  20.     TypedQuery query = em.createQuery("select a from Account a where a.customer = ?1", Account.class);  
  21.     query.setParameter(1, customer);  
  22.  
  23.     return query.getResultList();  
  24.   }  

重構(gòu)之后,我們將save(...)實(shí)際委派給repository。在默認(rèn)情況下,如果一個(gè)實(shí)體的主鍵屬性為null,那么repository實(shí)現(xiàn)會(huì)將其作為新建實(shí)體,正如你在前面的例子中所看到的一樣(注意,如果有必要,你可以對(duì)其進(jìn)行更為詳細(xì)的控制) 。除此之外,Spring Data JPA repository實(shí)現(xiàn)類已經(jīng)被@Transactional標(biāo)注的CRUD等方法可以摒棄@Transactional聲明。

下一步,我們將重構(gòu)查詢方法。并且使查詢方法與保存方法遵循相同的委派策略。我們?cè)诖鎯?chǔ)庫接口里面引入查詢方法并且將我們?cè)蟹椒ㄎ薪o新引進(jìn)的方法:

  1. @Transactional(readOnly = true)   
  2. public interface AccountRepository extends JpaRepository<Account, Long> {  
  3.  
  4.   List<Account> findByCustomer(Customer customer);   
  1. @Repository 
  2. @Transactional(readOnly = true)  
  3. class AccountServiceImpl implements AccountService {  
  4.  
  5.   @Autowired 
  6.   private AccountRepository repository;  
  7.  
  8.   @Override 
  9.   @Transactional 
  10.   public Account save(Account account) {  
  11.     return repository.save(account);  
  12.   }  
  13.  
  14.   @Override 
  15.   public List<Account> findByCustomer(Customer customer) {  
  16.     return repository.findByCustomer(Customer customer);  
  17.   }  

我們快速補(bǔ)充點(diǎn)事務(wù)處理的知識(shí)。在這種非常簡單的情況下我們可以從AccountServiceImpl實(shí)現(xiàn)類中移除@Transaction注解,因?yàn)樵诖鎯?chǔ)庫的CRUD方法已經(jīng)進(jìn)行了事務(wù)管理,查詢方法在存儲(chǔ)庫接口中也已經(jīng)用@Transactional(readOnly = true)進(jìn)行了標(biāo)注。當(dāng)前設(shè)置——在service層次標(biāo)記為事務(wù)性的方法是一個(gè)最佳實(shí)踐(盡管在這里并不需要),因?yàn)楫?dāng)你在service層次查看方法時(shí)它可以顯式清楚的表明操作是在同一個(gè)事務(wù)中處理的。除此之外,如果一個(gè)service層次的方法修改了,需要進(jìn)行多次的存儲(chǔ)庫方法調(diào)用,這種情況下所有的代碼任然將會(huì)在同一個(gè)事務(wù)中執(zhí)行,因?yàn)樵诖鎯?chǔ)庫內(nèi)部的事務(wù)將會(huì)簡單的加入到外部service層次的事務(wù)中。存儲(chǔ)庫事務(wù)行為和調(diào)整方式在 參考文檔中有詳細(xì)說明。

嘗試再次運(yùn)行測(cè)試案例,看看測(cè)試是否正常運(yùn)行。打住,我們還沒有實(shí)現(xiàn)forfindByCustomer()方法,是不?那它是如何工作的呢?

#p#

查詢方法

當(dāng)Spring Data JPA為創(chuàng)建AccountRepository接口創(chuàng)建Spring實(shí)例的時(shí)候,它會(huì)檢查接口里面定義的所有查詢方法并且 為它們每個(gè)都派生一個(gè)查詢。默認(rèn)情況下,Spring Data JPA 將自動(dòng)解析方法名并以此創(chuàng)建一個(gè)查詢,查詢用標(biāo)準(zhǔn)JPA的API實(shí)現(xiàn)。在本例中findByCustomer(...)方法在邏輯上等同于JPQL 查詢“select a from Account a where a.customer = ?1”。解析方法名稱的解析器支持大量的關(guān)鍵字比如And,Or,GreaterThan,LessThan,Like,IsNull,Notand等等,如果您喜歡,您還可以添加ORDER BY子句。有關(guān)詳情請(qǐng)參閱文檔。這種機(jī)制給我們提供了一個(gè)查詢方法編程模型就像你在Grails 或 Spring Roo中用到的一樣。

現(xiàn)在,假設(shè)你想要顯式的使用指定的查詢。要做到這點(diǎn)你可以按照如下命名規(guī)約(本例中為Account.findByCustomer)在實(shí)體上通過注解或在orm.xml中聲明一個(gè)JPA命名的查詢來實(shí)現(xiàn),另外一個(gè)選擇就是你可以在存儲(chǔ)庫方法中使用@Query注解:

  1. @Transactional(readOnly = true)  
  2. public interface AccountRepository extends JpaRepository<Account, Long> {  
  3.  
  4.   @Query("<JPQ statement here>")  
  5.   List<Account> findByCustomer(Customer customer);   

現(xiàn)在我們對(duì)CustomerServiceImpl用我們已經(jīng)看到的特性做一個(gè)前后對(duì)比:

  1. @Repository 
  2. @Transactional(readOnly = true)  
  3. public class CustomerServiceImpl implements CustomerService {  
  4.  
  5.   @PersistenceContext 
  6.   private EntityManager em;  
  7.  
  8.   @Override 
  9.   public Customer findById(Long id) {  
  10.     return em.find(Customer.class, id);  
  11.   }  
  12.  
  13.   @Override 
  14.   public List<Customer> findAll() {  
  15.     return em.createQuery("select c from Customer c", Customer.class).getResultList();  
  16.   }  
  17.  
  18.   @Override 
  19.   public List<Customer> findAll(int page, int pageSize) {  
  20.  
  21.     TypedQuery query = em.createQuery("select c from Customer c", Customer.class);  
  22.  
  23.     query.setFirstResult(page * pageSize);  
  24.     query.setMaxResults(pageSize);  
  25.  
  26.     return query.getResultList();  
  27.   }  
  28.  
  29.   @Override 
  30.   @Transactional 
  31.   public Customer save(Customer customer) {  
  32.  
  33.     // Is new?  
  34.     if (customer.getId() == null) {  
  35.       em.persist(customer);  
  36.       return customer;  
  37.     } else {  
  38.       return em.merge(customer);  
  39.     }  
  40.   }  
  41.  
  42.   @Override 
  43.   public List<Customer> findByLastname(String lastname, int page, int pageSize) {  
  44.  
  45.     TypedQuery query = em.createQuery("select c from Customer c where c.lastname = ?1", Customer.class);  
  46.  
  47.     query.setParameter(1, lastname);  
  48.     query.setFirstResult(page * pageSize);  
  49.     query.setMaxResults(pageSize);  
  50.  
  51.     return query.getResultList();  
  52.   }  

好吧,首先創(chuàng)建CustomerRepository并消除CRUD方法:

  1. @Transactional(readOnly = true)  
  2. public interface CustomerRepository extends JpaRepository<Customer, Long> { … } 
  1. @Repository 
  2. @Transactional(readOnly = true)  
  3. public class CustomerServiceImpl implements CustomerService {  
  4.  
  5.   @PersistenceContext 
  6.   private EntityManager em;  
  7.  
  8.   @Autowired 
  9.   private CustomerRepository repository;  
  10.  
  11.   @Override 
  12.   public Customer findById(Long id) {  
  13.     return repository.findById(id);  
  14.   }  
  15.  
  16.   @Override 
  17.   public List<Customer> findAll() {  
  18.     return repository.findAll();  
  19.   }  
  20.  
  21.   @Override 
  22.   public List<Customer> findAll(int page, int pageSize) {  
  23.  
  24.     TypedQuery query = em.createQuery("select c from Customer c", Customer.class);  
  25.  
  26.     query.setFirstResult(page * pageSize);  
  27.     query.setMaxResults(pageSize);  
  28.  
  29.     return query.getResultList();  
  30.   }  
  31.  
  32.   @Override 
  33.   @Transactional 
  34.   public Customer save(Customer customer) {  
  35.     return repository.save(customer);  
  36.   }  
  37.  
  38.   @Override 
  39.   public List<Customer> findByLastname(String lastname, int page, int pageSize) {  
  40.  
  41.     TypedQuery query = em.createQuery("select c from Customer c where c.lastname = ?1", Customer.class);  
  42.  
  43.     query.setParameter(1, lastname);  
  44.     query.setFirstResult(page * pageSize);  
  45.     query.setMaxResults(pageSize);  
  46.  
  47.     return query.getResultList();  
  48.   }  

到目前為止,一切都很好。以下兩種方法都可以處理常見的場(chǎng)景:你希望給定查詢能夠分頁而不是返回全部實(shí)體(比如一頁10條記錄)。眼下我們通過兩個(gè)整數(shù)適當(dāng)限制查詢來實(shí)現(xiàn),但這樣做有兩個(gè)問題,兩個(gè)整數(shù)實(shí)際上只代表了一個(gè)方面,這里并沒有明確這一點(diǎn)。除此之外,結(jié)果我們只返回了一個(gè)簡單的list,所以我們丟掉了實(shí)際頁面的元數(shù)據(jù)信息:這是第一頁嗎?這是最后一頁嗎?總共有多少頁?Spring Data提供了一個(gè)抽象包括兩個(gè)接口:Pageable(捕捉分頁請(qǐng)求)和Page(捕獲結(jié)果以及元信息)。讓我們按照如下方式嘗試添加 findByLastname(…)到存儲(chǔ)庫接口中并重寫findAll(…)和findByLastname(…)方法:

  1. @Transactional(readOnly = true)   
  2. public interface CustomerRepository extends JpaRepository<Customer, Long> {  
  3.  
  4.   Page<Customer> findByLastname(String lastname, Pageable pageable);   
  1. @Override   
  2. public Page<Customer> findAll(Pageable pageable) {  
  3.   return repository.findAll(pageable);  
  4. }  
  5.  
  6. @Override 
  7. public Page<Customer> findByLastname(String lastname, Pageable pageable) {  
  8.   return repository.findByLastname(lastname, pageable);   

請(qǐng)確保按照名字的變化對(duì)測(cè)試用例進(jìn)行了適配,這樣它應(yīng)該能正常運(yùn)行。歸結(jié)下來為兩件事:我們有CRUD方法支持分頁并且查詢執(zhí)行機(jī)制知道分頁的參數(shù)。在這個(gè)階段,我們的包裝類實(shí)際上已經(jīng)過時(shí)了,因?yàn)榭蛻舳艘部梢灾苯诱{(diào)用我們的存儲(chǔ)庫接口,這樣我們擺脫了整個(gè)的實(shí)現(xiàn)代碼。

總結(jié)

在本文的課程中,我們把為存儲(chǔ)庫編寫的代碼減少到2個(gè)接口,包含3個(gè)方法一行XML:

  1. @Transactional(readOnly = true)   
  2. public interface CustomerRepository extends JpaRepository<Customer, Long> {  
  3.  
  4.     Page<Customer> findByLastname(String lastname, Pageable pageable);   
  1. @Transactional(readOnly = true)  
  2. public interface AccountRepository extends JpaRepository<Account, Long> {  
  3.  
  4.     List<Account> findByCustomer(Customer customer);   
  1. <jpa:repositories base-package="com.acme.repositories" /> 

我們擁有類型安全的CRUD方法、查詢執(zhí)行方法和內(nèi)置的分頁功能。這不僅適用于基于JPA的存儲(chǔ)庫,而且也適用于非關(guān)系型數(shù)據(jù)庫,這很酷。第一個(gè)支持這些功能的非關(guān)系型數(shù)據(jù)庫是MongoDB ,它是幾天后發(fā)版的Spring Data Document中的一部分。你將會(huì)獲得Mongo DB版的所有這些特性,而且我們還將支持其它一些數(shù)據(jù)庫。另外,還有其它一些特性等待我們?nèi)ヌ矫?比如,實(shí)體審計(jì),自定義數(shù)據(jù)訪問代碼集成) ,我們會(huì)在后續(xù)的博文中涉及。

英文原文:Getting started with Spring Data JPA

譯文鏈接:http://www.oschina.net/translate/getting-started-with-spring-data-jpa

責(zé)任編輯:林師授 來源: OSCHINA編譯
相關(guān)推薦

2012-03-06 11:25:40

ibmdw

2025-10-20 02:00:00

2019-09-30 10:51:11

Markdown標(biāo)記語言

2021-10-06 23:31:45

HibernateJPASpring Data

2022-06-09 09:00:00

編程語言后端Dark

2021-02-14 10:05:54

PowerCLI虛擬化語言

2017-08-25 14:29:43

機(jī)器學(xué)習(xí)Java

2022-04-28 08:05:05

數(shù)據(jù)庫數(shù)據(jù)庫交互

2020-03-25 09:53:33

人工智能AI技術(shù)

2011-06-24 17:22:29

Qt Quick QML

2019-12-23 13:20:34

LinuxLumina

2022-11-17 07:57:34

2012-03-17 21:45:02

JavaScript

2018-05-09 20:08:09

人工智能深度學(xué)習(xí)Python

2017-06-27 14:58:21

備份數(shù)據(jù)庫Oracle

2024-05-24 10:01:12

2021-04-21 20:42:42

Nadam梯度優(yōu)化

2015-02-03 14:56:55

2010-05-25 10:17:37

云計(jì)算

2023-06-21 08:00:00

微服務(wù)架構(gòu)
點(diǎn)贊
收藏

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

欧美日韩国产免费| 国产精品视频在线看| 91国语精品自产拍在线观看性色| 亚洲av成人片色在线观看高潮| 午夜日韩成人影院| 亚洲人成在线播放网站岛国| 国产精品三区www17con| 无码人妻一区二区三区免费| 99久久精品费精品国产风间由美 | 国模私拍一区二区| 欧美在线精品一区| 亚洲欧美日韩在线高清直播| 亚洲第一色av| 另类激情视频| 一区二区三区**美女毛片| 欧美 日韩 国产在线| 国产免费久久久| 久久国产福利| 欧美—级a级欧美特级ar全黄| 国产精品揄拍100视频| www.久久草.com| 色综合久久久久综合体 | 亚洲精品日韩久久| 精品国产欧美成人夜夜嗨| 久久亚洲AV成人无码国产野外| 亚洲国产伊人| 在线观看免费亚洲| 日本a视频在线观看| 国产成人高清精品| 欧美经典三级视频一区二区三区| 国产欧美日韩综合一区在线观看| 亚洲天堂男人网| 天堂资源在线中文精品| 午夜精品久久久久久久99热| 69av视频在线| 亚洲天堂一区二区三区四区| 在线视频亚洲欧美| 91成年人网站| 亚洲黄页网站| 日韩二区三区在线| 免费不卡的av| 97久久亚洲| 精品久久久久av影院| 捷克做爰xxxⅹ性视频| 欧美天堂一区二区| 欧美人与禽zozo性伦| 蜜桃免费在线视频| 蜜桃精品在线| 91九色02白丝porn| 黄色国产小视频| 国模套图日韩精品一区二区| 精品色蜜蜜精品视频在线观看| www.国产在线播放| 黄色成人在线网| 亚洲一级二级在线| 日韩精品一区二区在线视频| 青青在线视频| 亚洲午夜日本在线观看| 黄色一级视频在线播放| 九色porny视频在线观看| 精品国产成人在线| 日本黄网站免费| 亚洲第一会所001| 欧美日韩一区二区在线视频| www.桃色.com| 91成人精品在线| 亚洲福利在线视频| 美女100%无挡| 久久高清免费| 蜜臀久久99精品久久久无需会员| 欧美色图亚洲视频| 尤物网精品视频| 欧洲精品毛片网站| 超碰在线97观看| 久久99精品久久久久婷婷| 成人做爽爽免费视频| 国产夫绿帽单男3p精品视频| 国产99久久久久久免费看农村| 国产精品国产三级国产专区53| 无码国产精品一区二区免费16| 91看片淫黄大片一级在线观看| 日本在线播放一区| 黄视频网站在线| 亚洲国产成人av网| 黄色高清无遮挡| 国产精久久久| 日韩精品中文字幕在线播放| 日韩欧美视频免费观看| 国产一区清纯| 国产精品av电影| 国产黄色免费大片| 久久精品一区二区| 7777在线视频| 亚洲精品国产精品国产| 欧美美女bb生活片| 国产成人精品无码片区在线| 精品理论电影在线| 九九热精品在线| 无码免费一区二区三区| 国产一区二区不卡在线| 久久精品丝袜高跟鞋| h视频在线观看免费| 亚洲综合一二区| 亚洲五月天综合| 亚洲精品一区二区三区中文字幕| 亚洲欧洲日本专区| 欧美日韩激情在线观看| 日本欧美大码aⅴ在线播放| 9a蜜桃久久久久久免费| 国产小视频免费在线网址| 亚洲美女视频一区| 国产福利视频在线播放| 中文字幕久久精品一区二区| 在线a欧美视频| 日韩一区二区视频在线| 国产不卡在线视频| 一区二区精品国产| 波多野结衣亚洲| 精品欧美一区二区在线观看| 国产99在线 | 亚洲| 日本一二三区在线视频| 精品视频97| 97在线免费观看| 国产精品福利电影| 国产欧美精品国产国产专区 | 免费黄色在线视频| 黄色av一区| 亚洲字幕在线观看| 97电影在线| 在线观看欧美黄色| 一级黄色性视频| 国产一区二区你懂的| 痴汉一区二区三区| av在线影院| 欧美日本高清视频在线观看| 在线视频第一页| 另类亚洲自拍| 蜜桃视频在线观看91| 国产精品电影| 亚洲国产中文字幕久久网| 欧美精品乱码视频一二专区| 国产综合成人久久大片91| 伊人久久大香线蕉午夜av| 成人国产精品入口免费视频| 亚洲一二三在线| 欧美日韩a v| 国产亚洲欧美日韩俺去了| 久久久久久久久久久免费视频| 任你弄精品视频免费观看| 97精品在线视频| 污污网站免费在线观看| 色综合一区二区| 蜜桃无码一区二区三区| 日日夜夜免费精品| 午夜精品亚洲一区二区三区嫩草| 成人全视频在线观看在线播放高清| 亚洲欧美日韩国产成人| 天天爱天天做天天爽| 国产精品网站导航| 搡的我好爽在线观看免费视频| heyzo久久| 成人久久18免费网站图片| 操你啦视频在线| 精品国产99国产精品| 国产成人在线免费视频| 国产日韩欧美精品电影三级在线| 99热手机在线| 爱情电影网av一区二区| 欧美成人性色生活仑片| 日本黄视频在线观看| 欧美午夜激情视频| 中文字幕第24页| 国产一区二区精品在线观看| 97中文字幕在线| 嫩草影视亚洲| 成人xvideos免费视频| 黑人另类精品××××性爽| 亚洲美女av在线播放| 中文字幕欧美在线观看| 一区二区国产视频| 欧美bbbbb性bbbbb视频| 男人的天堂久久精品| 影音先锋成人资源网站| 老牛国内精品亚洲成av人片| 国产精品1234| 色在线视频网| 亚洲人成在线观看网站高清| 一级欧美一级日韩| 欧美日韩国产黄| 亚洲综合久久av一区二区三区| 国产jizzjizz一区二区| 黄色免费网址大全| 狠狠综合久久| 亚洲国产另类久久久精品极度| 涩爱av色老久久精品偷偷鲁| 欧美在线视频一区| a视频在线免费看| 亚洲小视频在线观看| 亚洲第一成人av| 欧美私模裸体表演在线观看| www.99re7.com| 国产精品进线69影院| 国产精品九九视频| 麻豆精品国产传媒mv男同| 日本国产在线播放| 亚洲最大黄网| 香蕉久久免费影视| 日韩黄色网络| 51国产成人精品午夜福中文下载| 午夜日韩成人影院| 欧美激情中文字幕乱码免费| 色综合久久影院| 亚洲免费视频观看| 黑人精品一区二区三区| 欧美美女黄视频| 久久影视中文字幕| 精品久久久久久亚洲精品| 天天综合天天做| 国产精品欧美精品| 国产免费无遮挡吸奶头视频| 北岛玲一区二区三区四区| 一区二区三区国产好的精华液| 日韩国产高清影视| 黄色动漫网站入口| 亚洲精品女人| 日本福利视频一区| 国产精品红桃| 日韩中文字幕亚洲精品欧美| 国产精品99久久精品| 视频一区二区在线观看| 岳的好大精品一区二区三区| 好看的日韩精品视频在线| 亚洲国产欧美国产第一区| 成人日韩在线电影| 亚洲欧洲专区| 成人女保姆的销魂服务| 久久久国产精品网站| 国产精品va在线| 日韩一级二级| 国产精品成久久久久三级| 免费观看亚洲| 日韩av色综合| 蜜桃成人精品| 国产女精品视频网站免费| 久久久久毛片| 91精品美女在线| 国产一区二区三区国产精品| 91日韩在线播放| 国产电影一区二区| 91pron在线| 高清精品xnxxcom| 九九九久久久| 国产精品一区二区三区av麻| 日韩电影免费观看在| 欧美一站二站| 国产一区一区三区| 欧美日韩一卡| 国产视频九色蝌蚪| 视频一区二区欧美| 成 人 黄 色 小说网站 s色| 国产在线一区观看| 亚洲av无码一区东京热久久| 成人精品高清在线| 一本色道久久综合亚洲精品图片 | 日韩午夜激情av| 丁香六月天婷婷| 亚洲乱码国产乱码精品精| 韩国福利在线| 久久精品国产亚洲精品2020| 中文在线观看免费| 97精品久久久| 久久精品国产精品亚洲毛片| 97人摸人人澡人人人超一碰| 精品淫伦v久久水蜜桃| 日本免费一区二区三区| 99精品视频在线观看免费播放| 草草草视频在线观看| 国产精品毛片| 999这里有精品| av午夜一区麻豆| www亚洲色图| 一区二区久久久| 最近中文字幕av| 亚洲大尺度美女在线| 波多野结衣在线网站| 欧美国产日韩一区二区| 日本.亚洲电影| 国产精品国模大尺度私拍| 国产一区二区三区四区五区 | 欧美性生给视频| 亚洲国产欧美日韩另类综合| 午夜精品免费观看| 日韩一级片网站| 国产粉嫩一区二区三区在线观看| 久久不射电影网| 欧美精品高清| 国产综合 伊人色| 香蕉视频国产精品| 欧洲av无码放荡人妇网站| 国产精品一区一区三区| av黄色免费网站| 亚洲一区在线看| 中文字幕在线观看高清| 日韩电影网在线| 性xxxxfjsxxxxx欧美| 国产精品免费网站| 久久午夜影院| 国产成人免费高清视频| 日韩电影在线免费看| 国产真实乱人偷精品| 亚洲蜜臀av乱码久久精品| 黄色网址中文字幕| 亚洲国产成人精品女人久久久| 91官网在线| 国产成人av网| 日韩极品在线| 欧妇女乱妇女乱视频| 黄色日韩网站视频| 久久视频精品在线观看| 狠狠躁18三区二区一区| 亚洲精品无遮挡| 欧美成人激情视频免费观看| 国产精品xxx| 欧美亚洲免费高清在线观看 | 色综合天天综合网中文字幕| 农村妇女精品一二区| 成人精品鲁一区一区二区| 免费视频一二三区| 日韩一区二区免费在线电影| 日本中文字幕视频在线| 国产盗摄xxxx视频xxx69| 少妇久久久久| 日本精品一区二区三区四区| 不卡的av电影在线观看| 国产乡下妇女做爰毛片| 亚洲成人免费在线视频| 久久99亚洲网美利坚合众国| 99久久自偷自偷国产精品不卡| 91精品一区二区三区综合| 视频在线观看免费高清| 国产精品国产三级国产三级人妇| 亚洲av人无码激艳猛片服务器| 亚洲人成网站色ww在线| 色偷偷色偷偷色偷偷在线视频| 极品校花啪啪激情久久| 一本色道久久综合亚洲精品不| 偷偷色噜狠狠狠狠的777米奇| 午夜精品久久久久久久99水蜜桃| 人人妻人人玩人人澡人人爽| 国自产精品手机在线观看视频| 国产精品毛片视频| 日韩精品―中文字幕| 久久精品人人做人人综合| 国产又粗又猛又爽又| 正在播放欧美视频| 国产精品亚洲四区在线观看| 看一级黄色录像| 国产999精品久久久久久绿帽| 国产在线一区视频| 亚洲精品综合久久中文字幕| 91超碰碰碰碰久久久久久综合| 黄频视频在线观看| 国产·精品毛片| www.国产com| 色狠狠久久aa北条麻妃| 玖玖玖电影综合影院| 日韩av中文字幕第一页| 久久综合色8888| 91tv国产成人福利| 欧美老少做受xxxx高潮| 欧美一级三级| 狠狠躁狠狠躁视频专区| 亚洲一区二区欧美日韩| 嫩草研究院在线观看| 国产精品综合网站| 国产在线不卡| 最新中文字幕av| 777色狠狠一区二区三区| 92久久精品| 亚洲欧洲一二三| 成人天堂资源www在线| 精品无码一区二区三区的天堂| 久久视频在线直播| 奇米777国产一区国产二区| 亚洲欧美日韩一级| 亚洲午夜激情网页| 99视频在线观看地址| αv一区二区三区| 日本在线不卡视频一二三区| 日韩黄色免费观看| 亚洲视频视频在线| 136导航精品福利| 在线观看的毛片| 疯狂做受xxxx高潮欧美日本| 日本精品一区二区三区在线播放| 国产精品裸体一区二区三区| 免费欧美在线视频| 久久草视频在线| 欧美美最猛性xxxxxx| 欧美精选视频在线观看|