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

Hibernate框架中直接操作JDBC接口實例

開發 后端
本文分析了Hibernate框架在處理復雜查詢功能上的效率問題,提出并實現了一個在Hibernate框架內提供直接JDBC操作接口的解決方案,并實際驗證了該解決方案的有效性。

Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用面向對象編程思維來操縱數據庫。

Hibernate的優勢在于屏蔽了數據庫細節,對于新增修改刪除的數據層操作,不再需要跟具體的SQL語句打交道,簡單的對對象實例進行增刪改操作即可。但是,對于多表關聯、分組統計、排序等復雜的查詢功能時,由于Hibernate自身的O-R映射機制,父子表之間關聯取數據會產生大量冗余的查詢操作,性能低下。此類情況下,直接使用JDBC的SQL語句反而更加靈活和高效。

Hibernate框架處理復雜查詢問題實例分析

考慮如下數據庫實體示例,表A為主表,表B和表C為子表,A與B、A與C表均為1對多關系,在B表和C表中以A_ID外鍵字段關聯A表父記錄。

數據庫實體示例圖 
圖 1.數據庫實體示例圖

在Hibernate框架中,通常采用以下配置方式完成A表與B,C表父子實體之間的級聯查詢操作,Hibernate實體配置xml如下:

  1. 清單1.hibernate實體配置xml  
  2. A.hbm.xml:  
  3. <hibernate-mapping> 
  4. <classnameclassname="XXX.XXX.A"table="A"> 
  5. <idnameidname="id"type="long"> 
  6. <columnnamecolumnname="ID"/> 
  7. <generatorclassgeneratorclass="assigned"> 
  8. </generator> 
  9. </id> 
  10. <setnamesetname="children_B"cascade="delete"inverse="true"lazy="false"> 
  11. <keycolumnkeycolumn="A_ID"></key> 
  12. <one-to-manyclassone-to-manyclass="XXX.XXX.B"/> 
  13. </set> 
  14. <setnamesetname="children_C"cascade="delete"inverse="true"lazy="false"> 
  15. <keycolumnkeycolumn="A_ID"></key> 
  16. <one-to-manyclassone-to-manyclass="XXX.XXX.C"/> 
  17. </set> 
  18. </class> 
  19. </hibernate-mapping> 
  20.  
  21. B.hbm.xml:  
  22. <hibernate-mapping> 
  23. <classnameclassname="XXX.XXX.B"table="B"> 
  24. <idnameidname="id"type="long"> 
  25. <columnnamecolumnname="ID"/> 
  26. <generatorclassgeneratorclass="assigned"> 
  27. </generator> 
  28. </id> 
  29. <propertynamepropertyname="a_id"type="long"> 
  30. <columnnamecolumnname="A_ID"> 
  31. </column> 
  32. </property> 
  33. </class> 
  34. </hibernate-mapping> 
  35.  
  36. C.hbm.xml  
  37. <hibernate-mapping> 
  38. <classnameclassname="XXX.XXX.C"table="C"> 
  39. <idnameidname="id"type="long"> 
  40. <columnnamecolumnname="ID"/> 
  41. <generatorclassgeneratorclass="assigned"> 
  42. </generator> 
  43. </id> 
  44. <propertynamepropertyname="a_id"type="long"> 
  45. <columnnamecolumnname="A_ID"> 
  46. </column> 
  47. </property> 
  48. </class> 
  49. </hibernate-mapping> 

對應的Hibernate領域實體類代碼示例如下:

  1. 清單2.hibernate實體類示例  
  2. A.java:  
  3. publicclassAimplementsjava.io.Serializable,Comparable{  
  4. privatelongid;  
  5. privateSetchildren_b=newHashSet<B>();  
  6. privateSetchildren_c=newHashSet<C>();  
  7.  
  8. publicA(longid){  
  9. this.id=id;  
  10. }  
  11.  
  12. publiclonggetId(){  
  13. returnid;  
  14. }  
  15.  
  16. publicvoidsetId(longid){  
  17. this.id=id;  
  18. }  
  19.  
  20. publicSetgetChildern_b(){  
  21. returnchildren_b;  
  22. }  
  23.  
  24. publicvoidsetChildren_b(Setchildren_b){  
  25. this.children_b=children_b;  
  26. }  
  27.  
  28. publicSetgetChildern_c(){  
  29. returnchildren_c;  
  30. }  
  31.  
  32. publicvoidsetChildren_c(Setchildren_c){  
  33. this.children_c=children_c;  
  34. }  
  35.  
  36. publicintcompareTo(Objectother){  
  37. AotherSubject=(A)other;  
  38. longcurAmount=this.getChildren_b().size()+this.getChildren_c().size();  
  39. longotherAmount=otherSubject.getChildren_b().size()  
  40.  +otherSubject.getChildren_c().size();  
  41. if(curAmount<otherAmount)  
  42. {  
  43. return-1;  
  44. }  
  45. elseif(curAmount>otherAmount)  
  46. {  
  47. return1;  
  48. }  
  49. else  
  50. {  
  51. return0;  
  52. }  
  53. }  
  54. }  
  55.  
  56. B.java:  
  57. publicclassBimplementsjava.io.Serializable,Comparable{  
  58. privatelongid;  
  59. privatelonga_id;  
  60.  
  61. publiclonggetId(){  
  62. returnid;  
  63. }  
  64.  
  65. publicvoidsetId(longid){  
  66. this.id=id;  
  67. }  
  68.  
  69. publiclonggetA_id(){  
  70. returna_id;  
  71. }  
  72.  
  73. publicvoidsetA_id(longa_id){  
  74. this.a_id=a_id;  
  75. }  
  76.  
  77. publicB(longid){  
  78. this.id=id;  
  79. }  
  80. }  
  81.  
  82. C.java:  
  83. publicclassCimplementsjava.io.Serializable,Comparable{  
  84. privatelongid;  
  85. privatelonga_id;  
  86.  
  87. publiclonggetId(){  
  88. returnid;  
  89. }  
  90.  
  91. publicvoidsetId(longid){  
  92. this.id=id;  
  93. }  
  94.  
  95. publiclonggetA_id(){  
  96. returna_id;  
  97. }  
  98.  
  99. publicvoidsetA_id(longa_id){  
  100. this.a_id=a_id;  
  101. }  
  102.  
  103. publicC(longid){  
  104. this.id=id;  
  105. }  

假設現在要統計A表中從屬的B表和C表記錄之和最高的top10的A表記錄,在Hibernate框架下,由于取A表對應的數據庫記錄時,已關聯取出了對應的B、C表子記錄存放于A實體類的children_a,children_c的屬性中,因此top10的功能可以通過比較每個A表實體類中children_a、children_c的Set的size大小并進行排序得到,其代碼示例如下:

  1. 清單3.排序代碼示例  
  2. privateArrayList<A>sortAByAmount(ArrayList<A>all)  
  3. {  
  4. for(inti=0;i<all.size();i++)  
  5. {  
  6. for(intj=0;j<all.size()-i-1;++j)  
  7. {  
  8. if(all.get(j).compareTo(all.get(j+1))<=0)  
  9. {  
  10. Atemp=all.get(j);  
  11. all.set(j,all.get(j+1));  
  12. all.set(j+1,temp);  
  13. }  
  14. }  
  15. }  
  16. returnall;  

表面看來很方便,但是由于Hibernate是面向對象的O-R映射機制,每一條A表記錄的查詢實際都關聯有兩條B、C表查詢的SQL產生,我們可以看到Hibernate的SQL日志中:

  1. 清單4.Hibernatesql日志示例  
  2. Hibernate:selecta0_.IDasID2_fromAa0_wherea0_.ID='1' 
  3. Hibernate:selectb0_.IDasID2_,b0_.A_IDasA_ID2_fromBb0_whereb0_.ID=?  
  4. Hibernate:selectc0_.IDasID2_,c0_.A_IDasA_ID2_fromCc0_wherec0_.ID=? 

由上述Sql日志可以看出,每一條A表記錄的取出,都伴隨以A表ID為查詢條件關聯B,C表中A_ID外鍵字段的2條取子記錄的sql,這是由A.hbm.xml配置中“lazy=false”決定的。#p#

這種情況下,當A和B、C表中數據量越來越大時,A表取實體的操作開銷將隨著sql查詢的增多而增大,并且在緊接著的排序過程中,即使采用業界最快的快速排序算法,排序時間依然是隨原始排序實體數量的線性關系(O(nlgn)),效率會線性下降,最終無法滿足客戶的前臺查詢的效率要求。此類情況下如直接采用JDBC,則只需一條如下的SQL語句,即可完成該功能:

  1. 清單5.直接JDBC操作sql  
  2. select  
  3. tab1.ID,  
  4. tab1.sumCol+tab2.sumCol  
  5. from  
  6. (  
  7. selecta.ID,  
  8. count(b.ID)sumCol  
  9. fromAaleftjoinBbona.ID=b.ID  
  10. GROUPBY  
  11. a.ID  
  12. )tab1,  
  13. (  
  14. selecta.ID,  
  15. count(c.ID)sumCol  
  16. fromAaleftjoinCcona.ID=c.ID  
  17. GROUPBY  
  18. a.ID  
  19. )tab2  
  20. wheretab1.ID=tab2.ID  
  21. orderbytab1.sumCol+tab2.sumColdesc 

在以上JDBC方式下,即使A、B、C表的數據量持續增長,仍然只有1條SQL的開銷,不會出現SQL遞增的情況,因此耗時是在可控制的區間內的。并且讀者可以注意到上述SQL將3表關聯拆分成了2個子查詢,這樣避免了3表做笛卡爾積的數量和,進一步提高了查詢效率。由此可見,直接操作JDBC,除SQL的開銷可控外,還可以利用數據庫層各種機制,如上述查詢語句中的leftjoin、子查詢、索引…,靈活的調整SQL語句,以達到最佳的查詢性能。

由上可實例可看出,在多表關聯、排序等復雜的查詢情況下,Hibernate框架由于其自身對象封裝的特殊性,不能像JDBC直接操作SQL那樣很好的解決查詢中高效性和靈活性方面的需求,且由于其屏蔽了數據庫的底層,開發人員看到的只是Hibernate提供的數據層API,無法與靈活的使用SQL語句等數據庫底層細節。因此,有必要在Hibernate框架中提供直接操作JDBC的接口。

在Hibernate框架中提供操作JDBC的接口的解決方案

Hibernate的session機制

我們知道Hibernate框架本身也是建立在JDBC之上的數據持久層實現,因此,要在框架本身提供操作JDBC的接口,需要切入其對JDBC封裝的細節。通過研究和查閱Hibernate的框架源代碼及參考文檔,我們發現,Hibernate的Session會話是進行持久化的基礎,所有的持久化操作都是在Session的基礎上進行的,在實現上它是和JDBC中的connection數據庫連接綁定的,也就是說,Hibernate的會話域基于一個實際的connection類實例,二者之間的關系如下圖所示:

Hibernate Session機制示意圖 
圖 2.Hibernate Session機制示意圖

由上可以看到,Hibernate中的session是單線程的,代表了一次會話的過程。實際上是把一個JDBCConnection打包了,每一個Session實例和一個數據庫事務綁定。其生命周期是與與之關聯的connection實例的生命周期一致的。

具體解決方案

由上面的Hibernate的Session機制我們意識到,只要能獲取到Hibernate當前會話中的Connection,則獲得了JDBC的底層數據庫連接實例,剩下就都是JDBC的范疇了。再查閱Hibernate的API,發現HibernateTemplate類中SessionFactory成員的getCurrentSession()方法即可獲得Hibernate環境下的當前活動的Session會話,而Hibernate中Session實例的connection()方法即可獲得該會話中綁定的Connection數據庫連接實例。

問題迎刃而解了,既然可以操作Connection實例,那與之關聯的Statement、ResultSet等基本JDBC類均在我們控制范圍中了,我們采用接口模式設計一個輕量級解決方案,使其在保持原Hibernate的增刪改操作方式前提下靈活提供操作JDBC的接口。設計類圖如下圖所示:

解決方案設計類示意圖 
圖 3.解決方案設計類示意圖

設計中,AbstractHibernateDao類作為DAO操作的基本類,保留原有Hibenrate框架下的新增,修改,刪除等API。BaseHibernateDao類繼承AbstractHibernateDao類,在此類中增加了直接操作JDBC的接口。設計getConnection方法獲取JDBC的數據庫連接實例,設計getObjectsBySql方法作為對外的主要接口,該方法調用fetchObjects方法,這是具體的數據庫記錄到領域對象的轉換操作,需要使用者override該方法以完成自有領域對象的填充細節。實際實現的類代碼如下所示:

  1. 清單6.解決方案實現代碼  
  2. AbstractHibernateDao.java:  
  3. abstractpublicclassAbstractHibernateDaoextendsHibernateDaoSupport{  
  4.  
  5. protectedLoglogger=LogFactory.getLog(getClass());  
  6. protectedClassentityClass;  
  7.  
  8. protectedClassgetEntityClass(){  
  9. returnentityClass;  
  10. }  
  11.  
  12. publicListgetAll(){  
  13. returngetHibernateTemplate().loadAll(getEntityClass());  
  14. }  
  15.  
  16. publicvoidsave(Objecto){  
  17. getHibernateTemplate().saveOrUpdate(o);  
  18. }  
  19.  
  20. publicvoidremoveById(Serializableid){  
  21. remove(get(id));  
  22. }  
  23.  
  24. publicvoidremove(Objecto){  
  25. getHibernateTemplate().delete(o);  
  26. }  
  27.  
  28. }  
  29.  
  30. BaseHibernateDao.java:  
  31. abstractpublicclassBaseHibernateDaoextendsAbstractHibernateDao{  
  32. publicConnectiongetConnection()  
  33. {  
  34. try  
  35. {  
  36.  
  37. SessioncurSeesion=null;  
  38. Connectioncon=null;  
  39. curSeesion=super.getHibernateTemplate().getSessionFactory()  
  40.  .getCurrentSession();  
  41. con=curSeesion.connection();  
  42. returncon;  
  43. }  
  44. catch(Exceptiones)  
  45. {  
  46. System.out.println(es.getMessage());  
  47. returnnull;  
  48. }  
  49.  
  50. }  
  51.  
  52. publicArrayList<Object>fetchObjects(ResultSetrs)  
  53. {  
  54. ArrayList<Object>ret=newArrayList<Object>();  
  55. //example:  
  56. //while(rs.next())  
  57. //{  
  58. //Objectobject=newObject();  
  59. //rs.getString(1);  
  60. //rs.getString(2);  
  61. //ret.add(object);      
  62. //}  
  63. returnret;  
  64. }  
  65.  
  66. publicArrayList<Object>getObjectsBySql(StringpureSql)  
  67. {  
  68. Connectioncon=curSeesion.connection();  
  69. ps=con.prepareStatement(sqlbuf.toString());  
  70. rs=ps.executeQuery();  
  71. try  
  72. {  
  73. returnthis.fetchObjects(rs);   
  74.      
  75. }  
  76. catch(Exceptiones)  
  77. {  
  78. System.out.println(es.getMessage());  
  79. returnnull;  
  80. }  
  81. finally  
  82. {  
  83. try  
  84. {  
  85. ps.close();  
  86. rs.close();  
  87. con.close();  
  88. }  
  89. catch(SQLExceptione){  
  90. //TODOAuto-generatedcatchblock  
  91. e.printStackTrace();  
  92. }  
  93.      
  94. }  
  95. }  

使用該解決方案時,只需要將代碼包解壓至項目源代碼目錄,在想要直接操作JDBC接口的DAO模塊繼承BaseHibernateDao類,然后重寫fetchObjects方法填入從自身數據庫表字段填充到領域對象的操作,即可輕松調用getObjectsBySql傳入原生SQL語句,返回具體的領域對象實體集合,當然使用者也可以通過getConnection獲得JDBC的Connection實例來進行自己需要的特定的JDBC底層操作。仍然以上文中的A、B、C表為例,采用該解決方案完成top10取數的代碼示例如下:

  1. 清單7.使用解決方案示例  
  2. publicclasstestDAOextendsBaseHibernateDao{  
  3.  
  4. privateStringsqlQuery="selecttab1.ID,tab1.sumCol+tab2.sumCol"+  
  5. "from(selecta.ID,count(b.ID)sumCol"+  
  6. "fromAaleftjoinBbona.ID=b.ID"+  
  7. "GROUPBYa.ID)tab1,"+  
  8. "(selecta.ID,count(c.ID)sumCol"+  
  9. "fromAaleftjoinCcona.ID=c.ID"+  
  10. "GROUPBYa.ID)tab2"+  
  11. "wheretab1.ID=tab2.ID"+  
  12. "orderbytab1.sumCol+tab2.sumColdesc";  
  13.  
  14. @override  
  15. publicArrayList<A>fetchObjects(ResultSetrs)  
  16. {  
  17. ArrayList<A>ret=newArrayList<A>();  
  18. intcount=1;  
  19. while(rs.next())  
  20. {  
  21. Aa=newA();  
  22. a.setId(rs.getLong(1));  
  23. System.out.println("top"+(count++)+"amount:"+rs.getLong(2));  
  24. ret.add(object);      
  25. }  
  26. returnret;  
  27. }  
  28.  

解決方案驗證

在實際mySql數據庫環境中,以A表數據量1000條,B表數據量3W多條,C表數據量2000條情況下進行上文中提到的top 10的操作,采用Hibernate的耗時和用JDBC接口解決方案的效率比較如下:

Hibernate框架方式與JDBC接口方式效率比較 
表 1.Hibernate框架方式與JDBC接口方式效率比較

Hibernate框架方式與JDBC接口方式效率比較 
表 2.Hibernate框架方式與JDBC接口方式效率比較

由以上結果可以看出:在數據量遞增的情況下,采用Hibernate方式下效率與庫表數據呈線性增長,且排序的操作的效率也是一樣,而直接采用JDBC接口解決方案下效率遠遠高于Hibernate方式,且在數據量增長的情況下耗時的增長速度處于合理的區間內。

【編輯推薦】

  1. Hibernate的多對一和一對多操作實例
  2. Hibernate批量更新與刪除實例淺析
  3. 淺析Hibernate繼承關系樹的三種映射方式
  4. 教你如何在Hibernate中實例化集合和代理
  5. 淺析加速Hibernate應用程序開發
責任編輯:王曉東 來源: IBM
相關推薦

2009-07-06 17:36:06

ResultSetJDBC Connec

2010-07-08 10:28:51

UML接口

2014-01-02 10:46:35

PostgreSQLC++

2009-09-24 15:53:00

Hibernate J

2021-06-03 10:01:28

JDBCStatement接口

2021-05-21 10:01:01

JDBCJavaStatement接口

2021-06-22 10:24:22

Statement接口修改數據刪除數據

2011-04-19 13:10:11

MySQL儲存圖片

2011-05-16 13:40:13

MySQL儲存圖片

2009-09-25 11:27:19

Hibernate J

2009-07-09 16:01:27

2009-08-31 17:35:12

C#接口實例

2009-09-27 16:21:22

Hibernate C

2009-09-23 17:05:52

Hibernate S

2021-05-13 07:58:05

JDBC接口PreparedSta

2009-09-23 12:48:54

Hibernate I

2009-07-06 18:29:55

2010-07-20 13:53:44

Perl引用

2021-04-15 22:17:16

PythonExcel代碼

2009-09-22 13:41:10

直接使用Hiberna
點贊
收藏

51CTO技術棧公眾號

视频一区在线| 丁香花在线影院| 久久99精品国产| 欧美黑人巨大精品一区二区| 亚洲最大的黄色网| 国产美女久久| 午夜成人在线视频| 亚洲一区二区三区乱码| 欧美 日韩 人妻 高清 中文| 日韩成人精品在线观看| 欧美黑人性生活视频| 国产精品成人在线视频| 国产精品自在| 7777精品伊人久久久大香线蕉完整版 | 国产精品无码免费播放| 午夜亚洲精品| 色综合天天综合网国产成人网 | 国产精品日韩精品中文字幕| 欧美一区二区日韩一区二区| 免费激情视频在线观看| 成人三级小说| 亚洲图片欧美激情| 欧美中日韩免费视频| 亚洲国产一二三区| 久久电影国产免费久久电影 | **日韩最新| 日本丶国产丶欧美色综合| www.亚洲视频.com| 欧美午夜电影一区二区三区| 久久精品免视看| 国产亚洲一区在线播放| 精品国产av一区二区| 麻豆高清免费国产一区| 国产va免费精品高清在线观看| 久久伊人成人网| 亚洲91中文字幕无线码三区| 中文字幕日本精品| 久久精品国产亚洲av久| 女同一区二区三区| 精品国产成人系列| 岛国大片在线免费观看| 99久久99九九99九九九| 欧美乱妇20p| 久久久久久蜜桃一区二区| 成人美女视频| 精品久久在线播放| 欧美 丝袜 自拍 制服 另类| 免费在线看污片| 一区二区三区不卡视频| 91精品一区二区三区四区| 日本在线天堂| 1区2区3区欧美| 国产又大又长又粗又黄| 麻豆av在线导航| 综合久久一区二区三区| 丰满女人性猛交| 在线中文字幕视频观看| 亚洲激情欧美激情| 欧美黄色免费网址| 久色国产在线| 午夜精品久久久久久久久| 国产妇女馒头高清泬20p多| 国产极品人妖在线观看| 亚洲mv在线观看| 波多野结衣之无限发射| 在线看片福利| 欧美影视一区在线| 天天色天天综合网| 日韩在线网址| 日韩激情av在线播放| 91久久免费视频| 99久久视频| 欧美第一黄色网| 久久青青草视频| 日韩av在线播放中文字幕| 国产精品一区二区在线| 国产黄色大片网站| 成人午夜短视频| 欧美xxxx黑人又粗又长精品| www 日韩| 一区二区三区四区亚洲| 人人妻人人添人人爽欧美一区| 一区二区三区短视频| 精品视频1区2区3区| 中文字幕一区二区三区四| youjizzjizz亚洲| 亚洲毛片在线免费观看| 国产一区在线观看免费| 国产一区二区三区四区三区四 | 免费不卡av在线| 91tv亚洲精品香蕉国产一区| 欧美一个色资源| 在线观看日韩精品视频| 亚洲色图88| 国产91成人在在线播放| 国产在成人精品线拍偷自揄拍| 国产毛片精品国产一区二区三区| 久久国产欧美精品| 国精产品一区| 色一情一乱一乱一91av| 中文字幕第三区| 国产欧美一区二区三区精品观看 | 欧美精品一区二区久久婷婷| 无码人妻aⅴ一区二区三区69岛| 欧美一区二区三区另类| 日本亚洲精品在线观看| 国产片在线播放| 国产欧美一区二区三区在线看蜜臀 | 国产精品美女呻吟| 免费观看a视频| 中文字幕在线观看不卡| 日韩欧美一区三区| 99热这里有精品| 国产一区二区三区毛片| 日本特黄特色aaa大片免费| 久久福利视频一区二区| 欧美亚洲另类在线一区二区三区| 日韩少妇视频| 欧美区在线观看| 国产美女免费无遮挡| 伊人久久成人| 国产91社区| www久久日com| 欧美日本一道本在线视频| 超碰97人人干| 日韩香蕉视频| 成人av资源网| av理论在线观看| 欧美精品在线观看播放| 非洲一级黄色片| 久久国产精品亚洲77777| 国产精品久久久久av福利动漫| 激情在线小视频| 欧美日韩一区二区三区不卡| 不卡一区二区在线观看| 国产欧美短视频| 国产免费一区二区三区| 在线观看三级视频| 69久久夜色精品国产69蝌蚪网| www..com.cn蕾丝视频在线观看免费版 | 国产女人aaa级久久久级| 国产91在线免费| 欧美成人基地| 欧美在线视频在线播放完整版免费观看| 免费av一级片| 欧美日韩国产限制| 免费中文字幕av| 另类亚洲自拍| 四虎永久在线精品免费一区二区| 欧美特黄aaaaaaaa大片| 亚洲图片欧洲图片av| 精品国产乱子伦| 国产女主播在线一区二区| 亚洲黄色av网址| 日韩免费久久| 成人免费淫片aa视频免费| 久草资源在线| 日韩亚洲欧美中文三级| 亚洲国产精品午夜在线观看| aaa欧美色吧激情视频| 怡红院av亚洲一区二区三区h| 天堂av一区二区三区在线播放| 欧美综合一区第一页| 国产中文字幕在线播放| 欧美日韩国产影片| 久久久久成人精品无码| a级高清视频欧美日韩| 国产视频九色蝌蚪| 欧美精选一区二区三区| 成人情趣片在线观看免费| 成人福利片网站| 精品国产一区二区三区不卡| 1级黄色大片儿| 国产日韩欧美精品综合| 亚洲一二三不卡| 日韩午夜在线电影| 四虎影院一区二区三区| 日韩在线精品强乱中文字幕| 91国内精品久久| 91社区在线观看播放| 日韩欧美专区在线| 久久久久99精品成人片我成大片 | 亚洲精品国产精品国自产观看浪潮| 国产精品视频久久久久久久| 国产精品天天看| 亚洲无人区码一码二码三码| 久久久国产精品一区二区中文| 曰韩不卡视频| 日韩超碰人人爽人人做人人添| 国产精品露脸自拍| 国产蜜臀在线| 中文字幕欧美精品在线| 日本激情一区二区| 欧美老女人在线| 日韩三级av在线| 国产精品成人网| 亚洲色图14p| 国产一区二区久久| 人妻内射一区二区在线视频| 久久久久久免费视频| 日本不卡二区高清三区| www.丝袜精品| 91久久精品日日躁夜夜躁国产| 美女在线视频免费| 欧美成人精品h版在线观看| 国产高清在线| 亚洲激情国产精品| 99在线小视频| 欧美日韩一区二区电影| 久久久精品免费看| 一区二区三区在线免费| 羞羞在线观看视频| 久久精品欧美一区二区三区麻豆| 国产吃瓜黑料一区二区| 久久精品免费看| 北条麻妃在线一区| 亚洲国产1区| 日本道在线视频| 欧美黄色录像片| 欧美日韩日本网| 欧美久久香蕉| 国产精品v欧美精品v日韩精品| av日韩一区| 国产免费一区视频观看免费| 亚洲成人人体| 18久久久久久| 一区二区精品伦理... | 成人免费视频毛片| 亚洲一区二区精品3399| 国产97免费视频| 国产精品国产三级国产专播品爱网| 国产美女免费无遮挡| 久久综合视频网| 国精产品一区一区三区免费视频| 成人精品免费网站| 特级特黄刘亦菲aaa级| 国产99久久久国产精品| 久久久久无码精品| 国产精品影音先锋| 国产一级片中文字幕| 久久99深爱久久99精品| 在线观看国产福利| 狠狠色伊人亚洲综合成人| 污网站在线免费| 狠狠色综合日日| 无码人妻少妇色欲av一区二区| 国产精品亚洲综合一区在线观看| 日本一二三区在线| 国产乱国产乱300精品| 久久久精品视频国产| 国产乱对白刺激视频不卡| 男人添女人荫蒂国产| 粉嫩绯色av一区二区在线观看| 久久黄色一级视频| 丁香婷婷综合激情五月色| 成人性生活免费看| 91蜜桃免费观看视频| 一卡二卡三卡四卡| 国产日本亚洲高清| 乱老熟女一区二区三区| 亚洲欧美日韩国产另类专区| 欧美成人三级在线观看| 亚洲一区成人在线| 五月婷婷中文字幕| 91成人国产精品| 国产精品毛片一区视频播| 日韩一级高清毛片| 五月婷婷久久久| 伊人亚洲福利一区二区三区| 日本高清视频在线观看| 欧美人与性动交a欧美精品| 69av成人| 国产精品久久久久久久7电影| 99久热在线精品视频观看| 国产乱码精品一区二区三区不卡| 夜夜躁狠狠躁日日躁2021日韩| 午夜老司机精品| 欧美日韩在线大尺度| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | av每日在线更新| 久久亚洲国产精品| bbw在线视频| 国产精品直播网红| 成人h动漫免费观看网站| 秋霞在线观看一区二区三区| 99视频精品全部免费在线视频| 日本欧美视频在线观看| 久久久噜噜噜久久狠狠50岁| 一级黄色片在线免费观看| www.亚洲色图| 国产在线观看免费视频软件| 亚洲国产精品一区二区久久| 中文字幕欧美色图| 欧美精品一区在线观看| 337p日本欧洲亚洲大胆鲁鲁| 久久久久日韩精品久久久男男 | 粉嫩av一区二区三区免费观看| 天美av一区二区三区久久| 日本xxx免费| 视频在线在亚洲| 俄罗斯黄色录像| 亚洲人妖av一区二区| 天天操夜夜操视频| 欧美变态tickle挠乳网站| 最新国产在线观看| 97在线视频观看| 国产精品中文| 亚洲成人午夜在线| 国产亚洲精品久久久久婷婷瑜伽| 下面一进一出好爽视频| 中国av一区二区三区| 特级做a爱片免费69| 欧美mv日韩mv国产| 乱人伦中文视频在线| 欧美亚洲日本网站| www国产精品| 2022中文字幕| 精品一区二区成人精品| 一区二区伦理片| 精品国产91久久久| 亚洲精品喷潮一区二区三区| 久久精品91久久香蕉加勒比 | 欧美日韩精品综合在线| 三级视频网站在线| 国内精品久久影院| 一级毛片精品毛片| 永久免费看av| 韩国v欧美v亚洲v日本v| 欧美a级片免费看| 欧美日韩电影在线| 午夜小视频在线| 国产精品一区专区欧美日韩| 欧美一区二区三区激情视频| 亚洲视频在线a| 久久一区二区三区四区| 国产日产精品一区二区三区| 亚洲国产美女精品久久久久∴| segui88久久综合| 国产精品久久国产精品| 在线免费观看欧美| 国产精品熟妇一区二区三区四区| 亚洲精品日韩一| 国产丰满美女做爰| 欧美福利视频在线观看| 99精品国产高清一区二区麻豆| 美女黄色免费看| 成人国产亚洲欧美成人综合网 | 免费看亚洲片| 亚洲AV无码片久久精品| 91国产福利在线| 日本免费中文字幕在线| 成人亚洲综合色就1024| 欧美激情第8页| 中文字幕精品视频在线| 精品国产91久久久久久老师| 欧美精品久久久久久久久久丰满| 日本精品久久久久久久| 波多野结衣的一区二区三区| 亚洲欧洲日本精品| 亚洲色图欧美激情| 精品国产av一区二区三区| 久久免费视频网| 九九综合久久| 九九热99视频| 亚洲自拍偷拍麻豆| 色鬼7777久久| 国产精品美女免费看| 亚洲精品一区二区在线看| 久久久久99人妻一区二区三区| 精品国产乱码久久久久久虫虫漫画| 香蕉视频网站在线| 国产精品入口夜色视频大尺度 | 97精品一区二区视频在线观看| 嫩草一区二区三区| www.cao超碰| 欧美日韩国产激情| av在线首页| 超碰97在线播放| 日韩精彩视频在线观看| 欧美极品aaaaabbbbb| 精品亚洲va在线va天堂资源站| 桃花岛tv亚洲品质| 精品国产一区二区三区在线| 91色porny在线视频| 国产伦精品一区二区三区四区 | 国产乱码在线观看| 久久亚洲电影天堂| 天堂网av成人| 182午夜视频| 狠狠躁夜夜躁人人爽超碰91| 欧美性天天影视| 蜜桃传媒视频麻豆一区| 黄网站免费久久| 国产剧情在线视频| 欧美成人免费全部| 国产一区二区三区四区大秀| 日韩精品xxx| 欧美日韩大陆在线| 中老年在线免费视频| 成人小视频在线观看免费|