<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0

    6.5.4 使用HibernateCallBack

    HibernateTemplate還提供了一種更加靈活的方式來(lái)操作數(shù)據(jù)庫(kù),通過(guò)這種方式可以完全使用Hibernate的操作方式。HibernateTemplate的靈活訪問(wèn)方式可通過(guò)如下兩個(gè)方法完成:

    ?? ● Object execute(HibernateCallback action)。

    ?? ● List execute(HibernateCallback action)。

    這兩個(gè)方法都需要一個(gè)HibernateCallback的實(shí)例,HibernateCallback實(shí)例可在任何有效的Hibernate數(shù)據(jù)訪問(wèn)中使用。程序開(kāi)發(fā)者通過(guò)HibernateCallback,可以完全使用Hibernate靈活的方式來(lái)訪問(wèn)數(shù)據(jù)庫(kù),解決Spring封裝Hibernate后靈活性不足的缺陷。

    HibernateCallback是一個(gè)接口,該接口包含一個(gè)方法doInHibernate(org.hibernate. Session session),該方法只有一個(gè)參數(shù)Session。在開(kāi)發(fā)中提供HibernateCallback實(shí)現(xiàn)類時(shí),必須實(shí)現(xiàn)接口里包含的doInHibernate方法,在該方法體內(nèi)即可獲得Hibernate Session的引用,一旦獲得了Hibernate Session的引用,就可以完全以Hibernate的方式進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)。

    注意:doInHibernate方法內(nèi)可以訪問(wèn)Session,該Session對(duì)象是綁定在該線程的Session實(shí)例。該方法內(nèi)的持久層操作,與不使用Spring時(shí)的持久層操作完全相同。這保證了對(duì)于復(fù)雜的持久層訪問(wèn),依然可以使用Hibernate的訪問(wèn)方式。

    下面的代碼對(duì)HibernateDaoSupport類進(jìn)行擴(kuò)展(雖然Spring 2.0的HibernateTemplate提供了一個(gè)分頁(yè)方法setMaxResults,但僅此一個(gè)方法依然不能實(shí)現(xiàn)分頁(yè)查詢),這種擴(kuò)展主要是為該類增加了3個(gè)分頁(yè)查詢的方法,分頁(yè)查詢時(shí)必須直接調(diào)用Hibernate的Session完成,因此,必須借助于HibernateCallBack的幫助。

    public class YeekuHibernateDaoSupport extends HibernateDaoSupport

    {

    ??? /**

    ??? * 使用hql 語(yǔ)句進(jìn)行分頁(yè)查詢操作

    ??? * @param hql 需要查詢的hql語(yǔ)句

    ??? * @param offset 第一條記錄索引

    ??? * @param pageSize 每頁(yè)需要顯示的記錄數(shù)

    ??? * @return 當(dāng)前頁(yè)的所有記錄

    ??? */

    ??? public List findByPage(final String hql,

    ??????? final int offset, final int pageSize)

    ??? {

    ??????? //HibernateDaoSupport已經(jīng)包含了getHibernateTemplate()方法

    ??????? List list = getHibernateTemplate().executeFind(new
    ??????? HibernateCallback()

    ??????????? {

    ??????????????? public Object doInHibernate(Session session)

    ??????????????????? throws HibernateException, SQLException

    ??????????????? //該方法體內(nèi)以Hibernate方法進(jìn)行持久層訪問(wèn)

    ??????????????? {

    ??????????????????? List result = session.createQuery(hql)

    ??????????????????????????????????????? .setFirstResult(offset)

    ??????????????????????? ???????????????? .setMaxResults(pageSize)

    ??????????????????????????????????????? .list();

    ??????????????????? return result;

    ??????????????? }

    ??????????? });

    ??????? return list;

    ??? }

    ??? /**

    ??? * 使用hql 語(yǔ)句進(jìn)行分頁(yè)查詢操作

    ??? * @param hql 需要查詢的hql語(yǔ)句

    ??? * @param value 如果hql有一個(gè)參數(shù)需要傳入,value就是傳入的參數(shù)

    ??? * @param offset 第一條記錄索引

    ??? * @param pageSize 每頁(yè)需要顯示的記錄數(shù)

    ??? * @return 當(dāng)前頁(yè)的所有記錄

    ??? */

    ??? public List findByPage(final String hql , final Object value ,

    ??????? final int offset, final int pageSize)

    ??? {

    ??????? List list = getHibernateTemplate().executeFind(new
    ??????? HibernateCallback()

    ??????????? {

    ??????????????? public Object doInHibernate(Session session)

    ??????? ??????????? throws HibernateException, SQLException

    ??????????????? {

    ??????????????????? //下面查詢的是最簡(jiǎn)單的Hiberante HQL查詢

    ??????????????????? List result = session.createQuery(hql)

    ??????????????????????????????? ???????? .setParameter(0, value)

    ??????????????????????????????????????? .setFirstResult(offset)

    ??????????????????????? ???????????????? .setMaxResults(pageSize)

    ??????????????????? ??????????????????? .list();

    ??????????????????? return result;

    ??????????????? }

    ??????????? });

    ??????? return list;

    ??? }

    ??? /**

    ??? * 使用hql 語(yǔ)句進(jìn)行分頁(yè)查詢操作

    ??? * @param hql 需要查詢的hql語(yǔ)句

    ??? * @param values 如果hql有多個(gè)參數(shù)需要傳入,values就是傳入的參數(shù)數(shù)組

    ??? * @param offset 第一條記錄索引

    ??? * @param pageSize 每頁(yè)需要顯示的記錄數(shù)

    ??? * @return 當(dāng)前頁(yè)的所有記錄

    ??? */

    ??? public List findByPage(final String hql, final Object[] values,

    ??????? final int offset, final int pageSize)

    ??? {

    ??????? List list = getHibernateTemplate().executeFind(new
    ??????? HibernateCallback()

    ??????????? {

    ??????????????? public Object doInHibernate(Session session)

    ??????????????????? throws HibernateException, SQLException

    ??????????????? {

    ??????????????????? Query query = session.createQuery(hql);

    ??????????????????? for (int i = 0 ; i < values.length ; i++)

    ??????????????????? {

    ??????????????????????? query.setParameter( i, values[i]);

    ??????????????????? }

    ??????????????????? List result = query.setFirstResult(offset)

    ??????????????????????? ?????????????? .setMaxResults(pageSize)

    ??????????????????????????????????? ?? .list();

    ??????????????????? return result;

    ??????????????? }

    ??????????? });

    ??????? return list;

    ??? }

    }

    在上面的代碼實(shí)現(xiàn)中,直接使用了getHibernateTemplate()方法,這個(gè)方法由Hibernate- DaoSupport提供。而YeekuHibernateDaoSupport是HibernateDaoSupport的子類,因此,可以直接使用該方法。

    當(dāng)實(shí)現(xiàn)doInHibernate(Session session)方法時(shí),完全以Hibernate的方式進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn),這樣保證了Hibernate進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)的靈活性。

    注意:Spring提供的XxxTemplate和XxxCallBack互為補(bǔ)充,二者體現(xiàn)了Spring框架設(shè)計(jì)的用心良苦:XxxTemplate對(duì)通用操作進(jìn)行封裝,而XxxCallBack解決了封裝后靈活性不足的缺陷。

    6.5.5 實(shí)現(xiàn)DAO組件

    為了實(shí)現(xiàn)DAO組件,Spring提供了大量的XxxDaoSupport類,這些DAO支持類對(duì)于實(shí)現(xiàn)DAO組件大有幫助,因?yàn)檫@些DAO支持類已經(jīng)完成了大量基礎(chǔ)性工作。

    Spring為Hibernate的DAO提供了工具類HibernateDaoSupport。該類主要提供如下兩個(gè)方法以方便DAO的實(shí)現(xiàn):

    ?? ● public final HibernateTemplate getHibernateTemplate()。

    ?? ● public final void setSessionFactory(SessionFactory sessionFactory)。

    其中,setSessionFactory方法可用于接收Spring的ApplicationContext的依賴注入,可接收配置在Spring的SessionFactory實(shí)例,getHibernateTemplate方法用于返回通過(guò)SessionFactory產(chǎn)生的HibernateTemplate實(shí)例,持久層訪問(wèn)依然通過(guò)HibernateTemplate實(shí)例完成。

    下面實(shí)現(xiàn)的DAO組件繼承了Spring提供的HibernateDaoSupport類,依然實(shí)現(xiàn)了PersonDao接口,其功能與前面提供的PersonDao實(shí)現(xiàn)類完全相同。其代碼如下:

    public class PersonDaoHibernate extends HibernateDaoSupport implements PersonDao

    {

    ??? /**

    ???? * 加載人實(shí)例

    ???? * @param id 需要加載的Person實(shí)例的主鍵值

    ???? * @return 返回加載的Person實(shí)例

    ???? */

    ??? public Person get(int id)

    ??? {

    ??????? return (Person)getHibernateTemplate().get(Person.class, new
    ??????? Integer(id));

    ??? }

    ??? /**

    ???? * 保存人實(shí)例

    ???? * @param person 需要保存的Person實(shí)例

    ???? */???

    ??? public void save(Person person)

    ??? {

    ??????? getHibernateTemplate().save(person);

    ??? }

    ??? /**

    ???? * 修改Person實(shí)例

    ???? * @param person 需要修改的Person實(shí)例

    ???? */

    ??? public void update(Person person)

    ??? {

    ??????? getHibernateTemplate().update(person);

    ??? }

    ??? /**

    ???? * 刪除Person實(shí)例

    ???? * @param id 需要?jiǎng)h除的Person的id

    ???? */

    ??? public void delete(int id)

    ??? {

    ??????? getHibernateTemplate().delete(getHibernateTemplate().
    ??????? get(Person.class, new Integer(id)));

    ??? }

    ??? /**

    ???? * 刪除Person實(shí)例

    ???? * @param person 需要?jiǎng)h除的Person實(shí)例

    ???? */

    ??? public void delete(Person person)

    ??? {

    ??????? getHibernateTemplate().delete(person);

    ??? }

    ??? /**

    ???? * 根據(jù)用戶名查找Person

    ???? * @param name 用戶名

    ???? * @return 用戶名對(duì)應(yīng)的全部用戶

    ???? */

    ??? public List findByPerson(String name)

    ??? {

    ??????? return getHibernateTemplate().find("from Person p where p.name
    ??????? like ?" , name);???????

    ??? }

    ??? /**

    ??? * 返回全部的Person實(shí)例

    ??? * @return 全部的Person實(shí)例

    ??? */

    ??? public List findAllPerson()

    ??? {

    ??????? return getHibernateTemplate().find("from Person ");

    ??? }

    }

    上面的代碼與前面的PersonDAOImpl對(duì)比會(huì)發(fā)現(xiàn),代碼量大大減少。事實(shí)上,DAO的實(shí)現(xiàn)依然借助于HibernateTemplate的模板訪問(wèn)方式,只是HibernateDaoSupport將依賴注入SessionFactory的工作已經(jīng)完成,獲取HibernateTemplate的工作也已完成。該DAO的配置必須依賴于SessionFactory,配置文件與前面部署DAO組件的方式完全相同,此處不再贅述。

    在繼承HibernateDaoSupport的DAO實(shí)現(xiàn)里,Hibernate Session的管理完全不需要打開(kāi)代碼,而由Spring來(lái)管理。Spring會(huì)根據(jù)實(shí)際的操作,采用“每次事務(wù)打開(kāi)一次session”的策略,自動(dòng)提高數(shù)據(jù)庫(kù)訪問(wèn)的性能。

    6.5.6 使用IoC容器組裝各種組件

    至此為止,J2EE應(yīng)用所需要的各種組件都已經(jīng)出現(xiàn)了,從MVC層的控制器組件,到業(yè)務(wù)邏輯組件,以及持久層的DAO組件,已經(jīng)全部成功實(shí)現(xiàn)。應(yīng)用程序代碼并未將這些組件耦合在一起,代碼中都是面向接口編程,因此必須利用Spring的IoC容器將他們組合在一起。

    從用戶角度來(lái)看,用戶發(fā)出HTTP請(qǐng)求,當(dāng)MVC框架的控制器組件攔截到用戶請(qǐng)求時(shí),將調(diào)用系統(tǒng)的業(yè)務(wù)邏輯組件,而業(yè)務(wù)邏輯組件則調(diào)用系統(tǒng)的DAO組件,而DAO組件則依賴于SessionFactory和DataSource等底層組件實(shí)現(xiàn)數(shù)據(jù)庫(kù)訪問(wèn)。

    從系統(tǒng)實(shí)現(xiàn)角度來(lái)看,IoC容器先創(chuàng)建SessionFactory和DataSource等底層組件,然后將這些底層組件注入給DAO組件,提供一個(gè)完整的DAO組件,并將此DAO組件注入給業(yè)務(wù)邏輯組件,從而提供一個(gè)完整的業(yè)務(wù)邏輯組件,而業(yè)務(wù)邏輯組件又被注入給控制器組件,控制器組件負(fù)責(zé)攔截用戶請(qǐng)求,并將處理結(jié)果呈現(xiàn)給用戶——這一系列的銜接都由Spring的IoC容器提供實(shí)現(xiàn)。

    下面給出關(guān)于如何在容器中配置J2EE組件的大致模板,其模板代碼如下:

    <?xml version="1.0" encoding="GBK"?>

    <!-- beans是Spring配置文件的根元素,并且指定了Schema信息 -->

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 定義數(shù)據(jù)源Bean,使用C3P0數(shù)據(jù)源實(shí)現(xiàn) -->

    ??? <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    ??? destroy-method="close">

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng) -->

    ??????? <property name="driverClass" value="com.mysql.jdbc.Driver"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的URL -->

    ??????? <property name="jdbcUrl" value="jdbc:mysql://localhost/j2ee"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的用戶名 -->

    ??????? <property name="user" value="root"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)的密碼 -->

    ??????? <property name="password" value="32147"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的最大連接數(shù) -->

    ??????? <property name="maxPoolSize" value="40"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的最小連接數(shù) -->

    ??????? <property name="minPoolSize" value="1"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的初始化連接數(shù) -->

    ??????? <property name="initialPoolSize" value="1"/>

    ??????? <!-- 指定連接數(shù)據(jù)庫(kù)連接池的連接最大空閑時(shí)間 -->

    ??????? <property name="maxIdleTime" value="20"/>

    ??? </bean>

    ??? <!-- 定義Hibernate的SessionFactory Bean -->

    ??? <bean id="sessionFactory" class="org.springframework.orm.hibernate3.
    ??? LocalSessionFactoryBean">

    ??????? <!-- 依賴注入數(shù)據(jù)源,注入的正是上文中定義的dataSource -->

    ??????? <property name="dataSource" ref="dataSource"/>

    ??????? <!-- mappingResources屬性用來(lái)列出全部映射文件 -->

    ??????? <property name="mappingResources">

    ??????????? <list>

    ??????????????? <!-- 以下用來(lái)列出所有的PO映射文件 -->

    ??????????????? <value>lee/Person.hbm.xml</value>

    ??????????????? <!-- 此處還可列出更多的PO映射文件 -->

    ??????????? </list>

    ??????? </property>

    ????????? <!-- 定義Hibernate的SessionFactory屬性 -->

    ??????? <property name="hibernateProperties">

    ??????? ???? <props>

    ??????????????? <!-- 指定Hibernate的連接方言 -->

    ??????????? ??? <prop key="hibernate.dialect">org.hibernate.dialect.
    ??????????????? MySQLDialect</prop>

    ??????????????? <!-- 指定啟動(dòng)應(yīng)用時(shí),是否根據(jù)Hibernate映射文件創(chuàng)建數(shù)據(jù)表 -->

    ??????????? ????? <prop key="hibernate.hbm2ddl.auto">update</prop>

    ??????? ???? </props>

    ??????? </property>

    ??? </bean>

    ??? <!-- 配置Person持久化類的DAO Bean -->

    ??? <bean id="personDao" class="lee.PersonDaoImpl">

    ??????? <!-- 采用依賴注入來(lái)傳入SessionFactory的引用 -->

    ??????? <property name="sessionFactory" ref="sessionFactory"/>

    ??? </bean>

    ??? <!-- 下面能以相同的方式配置更多的持久化Bean -->

    ??? ...

    ??? <bean id="myService" class="lee.MyServiceImp">

    ??????? <!-- 注入業(yè)務(wù)邏輯組件所必需的DAO組件 -->

    ??? ??? <property name="peronDdao" ref=" personDao "/>

    ??????? <!-- 此處可采用依賴注入更多的DAO組件 -->

    ??????? ...

    ??? </bean>

    ??? <!-- 配置控制器Bean,設(shè)置起作用域?yàn)镽equest -->

    ??? <bean name="/login" class="lee.LoginAction" scope="request">

    ??????? <!-- 依賴注入控制器所必需的業(yè)務(wù)邏輯組件 -->

    ??????? <property name="myService" ref=" myService "/>

    ??? </bean>

    </beans>

    在上面的配置文件中,同時(shí)配置了控制器Bean、業(yè)務(wù)邏輯組件Bean、DAO組件Bean以及一些基礎(chǔ)資源Bean。各組件的組織被解耦到配置文件中,而不是在代碼層次的低級(jí)耦合。

    當(dāng)客戶端的HTTP請(qǐng)求向/login.do發(fā)送請(qǐng)求時(shí),將被容器中的lee.LoginAction攔截,LoginAction調(diào)用myService Bean,myService Bean則調(diào)用personDao等系列DAO組件,整個(gè)流程將系統(tǒng)中的各組件有機(jī)地組織在一起。

    注意:在實(shí)際應(yīng)用中,很少會(huì)將DAO組件、業(yè)務(wù)邏輯組件以及控制組件都配置在同一個(gè)文件中。而是在不同配置文件中,配置相同一組J2EE應(yīng)用組件。

    6.5.7 使用聲明式事務(wù)

    在上面的配置文件中,部署了控制器組件、業(yè)務(wù)邏輯組件、DAO組件,幾乎可以形成一個(gè)完整的J2EE應(yīng)用。但有一個(gè)小小的問(wèn)題:事務(wù)控制。系統(tǒng)沒(méi)有任何事務(wù)邏輯,沒(méi)有事務(wù)邏輯的應(yīng)用是不可想象的。

    Spring提供了非常簡(jiǎn)潔的聲明式事務(wù)控制,只需要在配置文件中增加事務(wù)控制片段,業(yè)務(wù)邏輯代碼無(wú)須任何改變。Spring的聲明式事務(wù)邏輯,甚至支持在不同事務(wù)策略之間切換。

    配置Spring聲明式事務(wù)時(shí),通常推薦使用BeanNameAutoProxyCreator自動(dòng)創(chuàng)建事務(wù)代理。通過(guò)這種自動(dòng)事務(wù)代理的配置策略,增加業(yè)務(wù)邏輯組件,只需要在BeanNameAutoProxyCreator Bean配置中增加一行即可,從而避免了增量式配置。

    在上面的配置模板文件中增加如下配置片段,系統(tǒng)的myService業(yè)務(wù)邏輯組件將變成事務(wù)代理Bean,從而為業(yè)務(wù)邏輯方法增加事務(wù)邏輯。

    ??? <!-- 配置Hibernate的局部事務(wù)管理器 -->

    ??? <!-- 使用HibernateTransactionManager類,該類是PlatformTransactionManager
    ??? 接口,針對(duì)采用Hibernate持久化連接的特定實(shí)現(xiàn) -->

    ??? <bean id="transactionManager"

    ????? ??? class="org.springframework.orm.hibernate3.
    ???????? HibernateTransactionManager">

    ??????? <!-- HibernateTransactionManager Bean需要依賴注入一個(gè)SessionFactory
    ??????? bean的引用 -->

    ??? ???? <property name="sessionFactory" ref="sessionFactory"/>

    ??? </bean>

    ??? <!-- 配置事務(wù)攔截器Bean -->

    ??? <bean id="transactionInterceptor"

    ??????? class="org.springframework.transaction.interceptor.
    ??????? TransactionInterceptor">

    ??????? <!-- 事務(wù)攔截器bean需要依賴注入一個(gè)事務(wù)管理器 -->

    ??????? <property name="transactionManager" ref="transactionManager"/>

    ??????? <property name="transactionAttributes">

    ??????????? <!-- 下面定義事務(wù)傳播屬性 -->

    ??????????? <props>

    ??????????????? <prop key="insert*">PROPAGATION_REQUIRED</prop>

    ??????????????? <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

    ??????????????? <prop key="*">PROPAGATION_REQUIRED</prop>

    ??????????? </props>

    ??????? </property>

    ??? </bean>

    ??? <!-- 定義BeanNameAutoProxyCreator的Bean后處理器 -->

    ??? <bean class="org.springframework.aop.framework.autoproxy.
    ??? BeanNameAutoProxyCreator">

    ??? <!-- 指定對(duì)滿足哪些bean name的bean自動(dòng)生成業(yè)務(wù)代理 -->

    ??? ??? <property name="beanNames">

    ??????????? <!-- 下面是所有需要自動(dòng)創(chuàng)建事務(wù)代理的Bean -->

    ??????????? <list>

    ??????????????? <value>myService</value>

    ??????????????? <!-- 下面還可增加需要增加事務(wù)邏輯的業(yè)務(wù)邏輯Bean -->

    ??????????????? ...

    ??????????? </list>

    ??????????? <!-- 此處可增加其他需要自動(dòng)創(chuàng)建事務(wù)代理的Bean -->

    ??? ??? </property>

    ??????? <!-- 下面定義BeanNameAutoProxyCreator所需的攔截器 -->

    ??????? <property name="interceptorNames">

    ??????????? <list>

    ??????????????? <value>transactionInterceptor</value>

    ??????????????? <!-- 此處可增加其他新的Interceptor -->

    ??????????? </list>

    ??????? </property>

    ??? </bean>

    一旦增加了如上的配置片段,系統(tǒng)中的業(yè)務(wù)邏輯方法就有了事務(wù)邏輯。這種聲明式事務(wù)配置方式可以在不同的事務(wù)策略之間自由切換。

    提示:盡量使用聲明式事務(wù)配置方式,而不要在代碼中完成事務(wù)邏輯。

    posted on 2009-07-19 10:24 jadmin 閱讀(377) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产裸体美女永久免费无遮挡| 国产又大又粗又长免费视频 | 国产成人免费高清激情明星 | 久久久亚洲精品视频| 一级毛片**免费看试看20分钟| 免费在线观看的黄色网址| 国产成人精品久久亚洲高清不卡| 亚洲精品成人a在线观看| 免费无码毛片一区二区APP| 亚洲精品永久在线观看| 免费在线观看a级毛片| 国产精品免费一区二区三区四区| 亚洲国产一区在线| 国产精品视频免费一区二区三区| 嫩草成人永久免费观看| 久久亚洲精品11p| 色婷婷六月亚洲婷婷丁香| 在线看片v免费观看视频777| 老司机午夜性生免费福利| 亚洲人成激情在线播放| 亚洲色爱图小说专区| 97国产在线公开免费观看| 美女黄色毛片免费看| 亚洲精品成人久久| 在线观看永久免费视频网站| 深夜福利在线免费观看| 亚洲国产精品人久久电影| 国产精品国产午夜免费福利看| 美女被cao网站免费看在线看| 疯狂做受xxxx高潮视频免费| 亚洲国产成人99精品激情在线| 亚洲欧洲日产国码av系列天堂| 午夜dj免费在线观看| 亚洲视频免费观看| 久久久久久久久无码精品亚洲日韩| 亚洲一级二级三级不卡| 激情综合色五月丁香六月亚洲| 日本一道高清不卡免费| 无码人妻一区二区三区免费手机 | 免费人成无码大片在线观看| 中文字幕无码不卡免费视频|